From 303354855db80e0c7bf3250894a007768f919536 Mon Sep 17 00:00:00 2001 From: Gabriel De La Parra Date: Fri, 13 Nov 2020 16:08:57 +0100 Subject: [PATCH] Code cleanup --- .../LnkSerialization.Console.csproj | 34 ++++---- LnkSerialization.Console/Program.cs | 68 ++++++++------- LnkSerialization.Core/LinkModel.cs | 49 ++++++----- LnkSerialization.Core/LnkSerialization.cs | 39 ++++----- .../LnkSerialization.UnitTests.csproj | 86 +++++++++---------- LnkSerialization.UnitTests/UnitTest.cs | 23 ++--- 6 files changed, 155 insertions(+), 144 deletions(-) diff --git a/LnkSerialization.Console/LnkSerialization.Console.csproj b/LnkSerialization.Console/LnkSerialization.Console.csproj index dc7a856..2b1a907 100644 --- a/LnkSerialization.Console/LnkSerialization.Console.csproj +++ b/LnkSerialization.Console/LnkSerialization.Console.csproj @@ -1,23 +1,23 @@ - - Exe - net5.0 - LnkSerialization - + + Exe + net5.0 + LnkSerialization + - - - + + + - - - + + + - - - PreserveNewest - - + + + PreserveNewest + + - + \ No newline at end of file diff --git a/LnkSerialization.Console/Program.cs b/LnkSerialization.Console/Program.cs index 7e218f6..9a25d9c 100644 --- a/LnkSerialization.Console/Program.cs +++ b/LnkSerialization.Console/Program.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; - using CommandLine; using CommandLine.Text; @@ -8,22 +7,17 @@ namespace LnkSerialization.Console { public class Program { - [Verb("serialize", HelpText = "Serializes a folder with *.lnk files to a .json file.\nUses a custom link model for the serialization.")] - private class SerializeOptions - { - [Option('i', "inputPath", Required = true, HelpText = "Input folder with *.lnk files.\nExample: 'c:\\dirSource'")] - public string InputPath { get; set; } - [Option('o', "outputfile", Required = true, HelpText = "Output path to json filename.\nExample: 'c:\\dirBackup\\links.json'")] - public string OutputFilename { get; set; } - } - - [Verb("deserialize", HelpText = "Takes a .json file with a collection of link models.\nDeserializes each link model to a *.lnk link.")] - private class DeserializeOptions + private static void DisplayHelp(ParserResult result, IEnumerable errs) { - [Option('i', "inputfile", Required = true, HelpText = "Path to json filename that contains links.\nExample: 'c:\\dirBackup\\links.json'")] - public string InputFilename { get; set; } - [Option('o', "outputPath", Required = true, HelpText = "Output folder where the *.lnk files will be created.\nExample: 'c:\\dirRestore'")] - public string OutputPath { get; set; } + var helpText = HelpText.AutoBuild(result, h => { + h.AdditionalNewLineAfterOption = false; + h.Heading = "Links Serialization Util"; + h.AddDashesToOption = true; + h.AutoHelp = true; + h.AutoVersion = true; + return HelpText.DefaultParsingErrorsHandler(result, h); + }, e => e); + System.Console.WriteLine(helpText); } private static void Main(string[] args) @@ -38,18 +32,9 @@ private static void Main(string[] args) .WithNotParsed(errs => DisplayHelp(parserResult, errs)); } - private static void DisplayHelp(ParserResult result, IEnumerable errs) + private static void RunDeserialize(DeserializeOptions options) { - var helpText = HelpText.AutoBuild(result, h => - { - h.AdditionalNewLineAfterOption = false; - h.Heading = $"Links Serialization Util"; - h.AddDashesToOption = true; - h.AutoHelp = true; - h.AutoVersion = true; - return HelpText.DefaultParsingErrorsHandler(result, h); - }, e => e); - System.Console.WriteLine(helpText); + Core.LnkSerialization.DeserializeLinksToFolder(options.InputFilename, options.OutputPath); } private static void RunSerialize(SerializeOptions options) @@ -57,9 +42,32 @@ private static void RunSerialize(SerializeOptions options) Core.LnkSerialization.SerializeLinkFolder(options.InputPath, options.OutputFilename); } - private static void RunDeserialize(DeserializeOptions options) + [Verb("serialize", + HelpText = + "Serializes a folder with *.lnk files to a .json file.\nUses a custom link model for the serialization.")] + private class SerializeOptions { - Core.LnkSerialization.DeserializeLinksToFolder(options.InputFilename, options.OutputPath); + [Option('i', "inputPath", Required = true, + HelpText = "Input folder with *.lnk files.\nExample: 'c:\\dirSource'")] + public string InputPath { get; set; } + + [Option('o', "outputfile", Required = true, + HelpText = "Output path to json filename.\nExample: 'c:\\dirBackup\\links.json'")] + public string OutputFilename { get; set; } + } + + [Verb("deserialize", + HelpText = + "Takes a .json file with a collection of link models.\nDeserializes each link model to a *.lnk link.")] + private class DeserializeOptions + { + [Option('i', "inputfile", Required = true, + HelpText = "Path to json filename that contains links.\nExample: 'c:\\dirBackup\\links.json'")] + public string InputFilename { get; set; } + + [Option('o', "outputPath", Required = true, + HelpText = "Output folder where the *.lnk files will be created.\nExample: 'c:\\dirRestore'")] + public string OutputPath { get; set; } } } -} +} \ No newline at end of file diff --git a/LnkSerialization.Core/LinkModel.cs b/LnkSerialization.Core/LinkModel.cs index ab0c281..6d78ef6 100644 --- a/LnkSerialization.Core/LinkModel.cs +++ b/LnkSerialization.Core/LinkModel.cs @@ -10,7 +10,29 @@ public class LinkModel { public LinkModel() { } - public LinkModel(string filename) => FromFilename(filename); + public LinkModel(string filename) + { + FromFilename(filename); + } + + public string Args { get; set; } + public string Filename { get; set; } + public string Path { get; set; } + public string WorkingDirectory { get; set; } + + public void ToLinkFile(string outputPath) + { + Shortcut.CreateShortcut(Path, Args, WorkingDirectory) + .WriteToFile(System.IO.Path.Combine(outputPath, Filename)); + } + + private void FromArguments(string path, string args, string workingDirectory, string filename) + { + Path = path; + Args = args; + WorkingDirectory = workingDirectory; + Filename = filename; + } private void FromFilename(string filename) { @@ -27,15 +49,14 @@ private void FromShortcut(Shortcut shortcut, string filename) ?? shortcut.ExtraData?.EnvironmentVariableDataBlock?.TargetUnicode ?? shortcut.ExtraData?.EnvironmentVariableDataBlock?.TargetAnsi ?? string.Empty; - if (path.IsEmpty()) - { + if (path.IsEmpty()) { var propStoreValues = shortcut .ExtraData? .PropertyStoreDataBlock? .PropertyStore? .SelectMany(x => x.PropertyStorage) .Select(x => x.TypedPropertyValue) - .Select(x => x.Value) + .Select(x => x.Value) ?? Array.Empty(); var values = propStoreValues @@ -48,30 +69,12 @@ private void FromShortcut(Shortcut shortcut, string filename) if (value.IsNotEmpty()) path = value; } + var args = shortcut.StringData?.CommandLineArguments ?? string.Empty; var workingDir = shortcut.StringData?.WorkingDir ?? string.Empty; var name = System.IO.Path.GetFileName(filename); FromArguments(path, args, workingDir, name); } - - private void FromArguments(string path, string args, string workingDirectory, string filename) - { - Path = path; - Args = args; - WorkingDirectory = workingDirectory; - Filename = filename; - } - - public void ToLinkFile(string outputPath) - { - Shortcut.CreateShortcut(Path, Args, WorkingDirectory) - .WriteToFile(System.IO.Path.Combine(outputPath, Filename)); - } - - public string Path { get; set; } - public string Args { get; set; } - public string WorkingDirectory { get; set; } - public string Filename { get; set; } } } \ No newline at end of file diff --git a/LnkSerialization.Core/LnkSerialization.cs b/LnkSerialization.Core/LnkSerialization.cs index d853550..b9cd7fe 100644 --- a/LnkSerialization.Core/LnkSerialization.cs +++ b/LnkSerialization.Core/LnkSerialization.cs @@ -1,9 +1,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; - using ShellLink; - using Wororo.Utilities; // Some useful links: @@ -18,22 +16,6 @@ public static class LnkSerialization public static string DefaultJsonFilename { get; set; } = "links.json"; public static string DefaultLinksFolder { get; set; } = @"%userProfile%\shortcuts\"; - public static void SerializeLinkFolder(string folderWithLinks, string outputJsonFilename = "") - { - if (folderWithLinks.IsEmpty()) - folderWithLinks = DefaultLinksFolder; - - if (outputJsonFilename.IsEmpty()) - outputJsonFilename = Path.Combine(folderWithLinks, DefaultJsonFilename); - - if (!Directory.Exists(folderWithLinks)) - return; - - var lnkFiles = Directory.GetFiles(folderWithLinks, "*.lnk"); - var list = lnkFiles.Select(lnkFile => new LinkModel(lnkFile)); - list.SerializeJson(outputJsonFilename); - } - public static void DeserializeLinksToFolder(string jsonFilename, string outputFolder) { if (jsonFilename.IsEmpty()) @@ -51,8 +33,9 @@ public static void DeserializeLinksToFolder(string jsonFilename, string outputFo outputFolder.CreatePathIfNotExists(); var links = JsonSerialization.DeserializeJson>(jsonFilename); - foreach (var linkModel in links) + foreach (var linkModel in links) { linkModel.ToLinkFile(outputFolder); + } } public static void SerializeAsShortcutJson(string linkFile) @@ -60,5 +43,21 @@ public static void SerializeAsShortcutJson(string linkFile) var lnkShortcut = Shortcut.ReadFromFile(linkFile); lnkShortcut.SerializeJson($"{Path.GetFileName(linkFile)}.json"); } + + public static void SerializeLinkFolder(string folderWithLinks, string outputJsonFilename = "") + { + if (folderWithLinks.IsEmpty()) + folderWithLinks = DefaultLinksFolder; + + if (outputJsonFilename.IsEmpty()) + outputJsonFilename = Path.Combine(folderWithLinks, DefaultJsonFilename); + + if (!Directory.Exists(folderWithLinks)) + return; + + var lnkFiles = Directory.GetFiles(folderWithLinks, "*.lnk"); + var list = lnkFiles.Select(lnkFile => new LinkModel(lnkFile)); + list.SerializeJson(outputJsonFilename); + } } -} +} \ No newline at end of file diff --git a/LnkSerialization.UnitTests/LnkSerialization.UnitTests.csproj b/LnkSerialization.UnitTests/LnkSerialization.UnitTests.csproj index 17c9176..6104ecf 100644 --- a/LnkSerialization.UnitTests/LnkSerialization.UnitTests.csproj +++ b/LnkSerialization.UnitTests/LnkSerialization.UnitTests.csproj @@ -1,51 +1,51 @@ - - net5.0 + + net5.0 - false - + false + - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + - - - + + + - - - + + + - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + - + \ No newline at end of file diff --git a/LnkSerialization.UnitTests/UnitTest.cs b/LnkSerialization.UnitTests/UnitTest.cs index 88f9796..7840790 100644 --- a/LnkSerialization.UnitTests/UnitTest.cs +++ b/LnkSerialization.UnitTests/UnitTest.cs @@ -5,31 +5,32 @@ namespace LnkSerialization.UnitTests { public class UnitTest { + [Fact] + public void TestRestoreMyLinks() + { + Core.LnkSerialization.DeserializeLinksToFolder("", "Output/"); + } + [Fact] public void TestSerializeAllLinksAsShortcuts() { var lnkFiles = Directory.GetFiles("Resources/", "*.lnk"); foreach (var lnkFile in lnkFiles) { - Core.LnkSerialization.SerializeAsShortcutJson(lnkFile); + Core.LnkSerialization.SerializeAsShortcutJson(lnkFile); } } [Fact] public void TestSerializeMyLinks() { - Core.LnkSerialization.SerializeLinkFolder("Resources/", ""); - } - - [Fact] - public void TestRestoreMyLinks() - { - Core.LnkSerialization.DeserializeLinksToFolder("", "Output/"); + Core.LnkSerialization.SerializeLinkFolder("Resources/"); } [Fact] public void TestSerializeMyProductionLinks() { - Core.LnkSerialization.SerializeLinkFolder(@"C:\Dev\settings\shortcuts\", @"C:\Dev\settings\shortcuts\shorcuts.json"); + Core.LnkSerialization.SerializeLinkFolder(@"C:\Dev\settings\shortcuts\", + @"C:\Dev\settings\shortcuts\shorcuts.json"); } [Fact] @@ -37,8 +38,8 @@ public void TestSerializeMyProductionLinksAsShortcuts() { var lnkFiles = Directory.GetFiles(@"C:\Dev\settings\shortcuts\", "*.lnk"); foreach (var lnkFile in lnkFiles) { - Core.LnkSerialization.SerializeAsShortcutJson(lnkFile); + Core.LnkSerialization.SerializeAsShortcutJson(lnkFile); } } } -} +} \ No newline at end of file