commit 6c5da795541523f1fadd6f5182b9b4768ea4c403
parent baea7b0cfb7ad786fe3a9f8c14d9096449f2cbc0
Author: Friedel Schön <[email protected]>
Date:   Fri, 22 Dec 2023 21:03:35 +0100
trailing arguments are inputs
Diffstat:
| M | README.md | 4 | ++-- | 
| M | src/main.d | 58 | +++++++++++++++++++++++++++++++++++++++++++++++++++------- | 
| M | src/sort.d | 50 | +++----------------------------------------------- | 
3 files changed, 56 insertions(+), 56 deletions(-)
diff --git a/README.md b/README.md
@@ -61,7 +61,7 @@ Look at the documentation at [`dpldocs.info`](https://importsort-d.dpldocs.info/
 "emeraldwalk.runonsave": {
     "commands": [
         {
-            "cmd": "importsort-d --inplace --inputs=${file}",
+            "cmd": "importsort-d --inplace ${file}",
             "match": "\\.d$"
         }
     ]
@@ -72,7 +72,7 @@ Look at the documentation at [`dpldocs.info`](https://importsort-d.dpldocs.info/
 ### How to add `importsort-d` to VIM/NeoVIM?
 > Just add this to your `.vimrc` or `init.vim`
 ```vim
-:autocmd BufWritePost * silent !importsort-d --inplace --inputs=<afile>
+:autocmd BufWritePost * silent !importsort-d --inplace <afile>
 ```
 
 ### Are cats cool?
diff --git a/src/main.d b/src/main.d
@@ -1,17 +1,61 @@
 // (c) 2022 Friedel Schon <[email protected]>
 
 module importsort.main;
-import importsort.sort : SortConfig;
-import argparse : CLI;
+
+import argparse;
 import core.stdc.stdlib : exit;
 import importsort.sort : Import, sortImports;
 import std.array : replace;
 import std.file : DirEntry, SpanMode, dirEntries, exists, isDir, isFile;
 import std.functional : unaryFun;
-import std.stdio : File, stderr, stdin, stdout;
 import std.range : empty;
+import std.stdio : File, stderr, stdin, stdout;
 import std.string : endsWith;
 
+/// current version (and something I always forget to update oops)
+enum VERSION = "0.3.0";
+
+/// configuration for sorting imports
+@(Command("importsort-d").Description("Sorts dlang imports").Epilog("Version: v" ~ VERSION))
+struct SortConfig {
+	@(ArgumentGroup("Input/Output arguments")
+			.Description(
+				"Define in- and output behavior. Trailing arguments are considered input-files.")) {
+		@(NamedArgument(["recursive", "r"]).Description("recursively search in directories"))
+		bool recursive = false;
+
+		@(NamedArgument(["inplace", "i"]).Description("writes to the input"))
+		bool inplace = false;
+
+		@(NamedArgument(["output", "o"]).Description("writes to `path` instead of stdout"))
+		string output;
+	}
+
+	@(ArgumentGroup("Sorting arguments").Description("Tune import sorting algorithms")) {
+		/// won't format the line, keep it as-is
+		@(NamedArgument(["keep", "k"]).Description("keeps the line as-is instead of formatting"))
+		bool keepLine = false;
+
+		@(NamedArgument(["attribute", "a"]).Description("public and static imports first"))
+		 /// sort by attributes (public/static first)
+		bool byAttribute = false;
+
+		@(NamedArgument(["binding", "b"]).Description("sorts by binding rather then the original"))
+		 /// sort by binding instead of the original
+		bool byBinding = false;
+
+		@(NamedArgument(["merge", "m"]).Description("merge imports which uses same file"))
+		 /// merges imports of the same source
+		bool merge = false;
+
+		/// ignore case when sorting
+		@(NamedArgument(["ignore-case", "c"]).Description("ignore case when comparing elements"))
+		bool ignoreCase = false;
+	}
+
+	string[] inputs;
+}
+
 /// list entries (`ls`) from all arguments
 DirEntry[] listEntries(alias F = "true")(string[] input, bool recursive) {
 	alias filterFunc = unaryFun!F;
@@ -42,7 +86,9 @@ DirEntry[] listEntries(alias F = "true")(string[] input, bool recursive) {
 	return entries;
 }
 
-int _main(SortConfig config) {
+mixin CLI!(SortConfig).main!((config, unparsed) {
+	config.inputs = unparsed;
+
 	if (config.recursive && config.inputs.empty) {
 		stderr.writeln("error: cannot use '--recursive' and specify no input");
 		exit(1);
@@ -64,6 +110,4 @@ int _main(SortConfig config) {
 		listEntries(config.inputs, config.recursive).sortImports(config);
 	}
 	return 0;
-}
-
-mixin CLI!(SortConfig).main!((config) { return _main(config); });
+});
diff --git a/src/sort.d b/src/sort.d
@@ -1,7 +1,10 @@
 module importsort.sort;
 
+import argparse;
+import importsort.main : SortConfig;
 import std.algorithm : findSplit, remove, sort;
 import std.array : split;
+import std.conv : to;
 import std.file : DirEntry, rename;
 import std.functional : unaryFun;
 import std.range : ElementType;
@@ -10,54 +13,7 @@ import std.stdio : File, stderr;
 import std.string : strip, stripLeft;
 import std.traits : isIterable;
 import std.typecons : Yes;
-import std.conv : to;
 import std.uni : asLowerCase;
-import argparse;
-
-/// current version (and something I always forget to update oops)
-enum VERSION = "0.3.0";
-
-/// configuration for sorting imports
-@(Command("importsort-d").Description("Sorts dlang imports").Epilog("Version: v" ~ VERSION))
-struct SortConfig {
-	@(ArgumentGroup("Input/Output arguments").Description("Define in- and output behavior")) {
-		@(NamedArgument(["recursive", "r"]).Description("recursively search in directories"))
-		bool recursive = false;
-
-		@(NamedArgument(["inplace", "i"]).Description("writes to the input"))
-		bool inplace = false;
-
-		@(NamedArgument(["output", "o"]).Description("writes to `path` instead of stdout"))
-		string output;
-
-		@(NamedArgument(["inputs", "in"])
-				.Description("input files or directories, can be set to '-' to read from stdin"))
-		string[] inputs;
-	}
-
-	@(ArgumentGroup("Sorting arguments").Description("Tune import sorting algorithms")) {
-		/// won't format the line, keep it as-is
-		@(NamedArgument(["keep", "k"]).Description("keeps the line as-is instead of formatting"))
-		bool keepLine = false;
-
-		@(NamedArgument(["attribute", "a"]).Description("public and static imports first"))
-		 /// sort by attributes (public/static first)
-		bool byAttribute = false;
-
-		@(NamedArgument(["binding", "b"]).Description("sorts by binding rather then the original"))
-		 /// sort by binding instead of the original
-		bool byBinding = false;
-
-		@(NamedArgument(["merge", "m"]).Description("merge imports which uses same file"))
-		 /// merges imports of the same source
-		bool merge = false;
-
-		/// ignore case when sorting
-		@(NamedArgument(["ignoreCase", "c"]).Description("ignore case when comparing elements"))
-		bool ignoreCase = false;
-	}
-
-}
 
 /// the pattern to determinate a line is an import or not
 enum PATTERN = ctRegex!`^(\s*)(?:(public|static)\s+)?import\s+(?:(\w+)\s*=\s*)?([a-zA-Z._]+)\s*(:\s*\w+(?:\s*=\s*\w+)?(?:\s*,\s*\w+(?:\s*=\s*\w+)?)*)?\s*;[ \t]*([\n\r]*)$`;