1+ namespace NekoLib . Archive ;
2+
3+ public class Program {
4+ class DecompressArgs {
5+ [ MiniCli . MiniName ( "i" ) ]
6+ [ MiniCli . Help ( "Path to root (first) archive" ) ]
7+ public required string Input = "" ;
8+
9+ [ MiniCli . MiniName ( "o" ) ]
10+ [ MiniCli . Help ( "Output directory" ) ]
11+ public required string Output = "" ;
12+ // [MiniCli.MiniName("D")]
13+ // public string[] LoadDlls;
14+ }
15+
16+ class CompressArgs {
17+ [ MiniCli . MiniName ( "i" ) ]
18+ [ MiniCli . Help ( "Input directories to compress" ) ]
19+ public string [ ] Input = [ ] ;
20+ [ MiniCli . MiniName ( "o" ) ]
21+ [ MiniCli . Help ( "Output directory" ) ]
22+ public string Output = "" ;
23+ [ MiniCli . MiniName ( "r" ) ]
24+ [ MiniCli . Help ( "use directory as root" ) ]
25+ public bool Root = false ;
26+ [ MiniCli . MiniName ( "m" ) ]
27+ [ MiniCli . Help ( "Max size of 1 archive data (in bytes)" ) ]
28+ public int ? MaxSize = null ;
29+ [ MiniCli . MiniName ( "n" ) ]
30+ [ MiniCli . Help ( "Name of the archives" ) ]
31+ public string Name = "" ;
32+ [ MiniCli . MiniName ( "t" ) ]
33+ [ MiniCli . Help ( "Compression type (ZSTD or NONE)" ) ]
34+ public string CompressionType = "ZSTD" ;
35+ [ MiniCli . MiniName ( "f" ) ]
36+ [ MiniCli . Help ( "Remove archives if exists" ) ]
37+ public bool Force = false ;
38+ // [MiniCli.MiniName("D")]
39+ // public string[] LoadDlls;
40+ }
41+
42+ class ZstdCompressArgs {
43+ [ MiniCli . MiniName ( "l" ) ]
44+ [ MiniCli . Help ( "Compression level" ) ]
45+ public int CompressionLevel = 3 ;
46+ [ MiniCli . MiniName ( "s" ) ]
47+ [ MiniCli . Help ( "Dictionary size (recommended to be ~100x less than data), 0 to disable" ) ]
48+ public int DictionarySize = 112640 ;
49+ }
50+
51+ public static void PrintHelp ( )
52+ {
53+ Console . WriteLine ( "Usage: dotnet NekoLib.Archive.dll -- command [ARGS]" ) ;
54+ Console . WriteLine ( "Available commands: decompress, compress" ) ;
55+ Console . WriteLine ( "decompress ARGS:" ) ;
56+ Console . WriteLine ( MiniCli . GetHelpFor < DecompressArgs > ( "\t " ) ) ;
57+ Console . WriteLine ( "Compress ARGS:" ) ;
58+ Console . WriteLine ( MiniCli . GetHelpFor < CompressArgs > ( "\t " ) ) ;
59+ Console . WriteLine ( "\t ZSTD compression extra:" ) ;
60+ Console . WriteLine ( MiniCli . GetHelpFor < ZstdCompressArgs > ( "\t \t " ) ) ;
61+ }
62+
63+ public static void Main ( string [ ] args ) {
64+ if ( args . Length < 1 ) {
65+ PrintHelp ( ) ;
66+ return ;
67+ }
68+ var arglist = args . ToList ( ) ;
69+ int i = 0 ;
70+ var subcommand = arglist [ 0 ] ;
71+ arglist . RemoveAt ( 0 ) ;
72+ if ( subcommand != "compress" && subcommand != "decompress" ) {
73+ Console . WriteLine ( "ERROR: Unknown verb " + subcommand ) ;
74+ PrintHelp ( ) ;
75+ return ;
76+ }
77+
78+ if ( subcommand == "compress" ) {
79+ var a = MiniCli . Parse < CompressArgs > ( arglist ) ;
80+ var comp = new NekoArchiveCompressor ( ) ;
81+
82+ switch ( a . Input . Length ) {
83+ case <= 0 :
84+ throw new ArgumentException ( "No input folders provided" ) ;
85+ case > 1 :
86+ throw new NotImplementedException ( ) ;
87+ }
88+
89+ foreach ( var path in a . Input ) {
90+ comp . AddDirectoryPath ( path ) ;
91+ }
92+ if ( a . Output != "" )
93+ comp . SetOutputDir ( a . Output ) ;
94+ if ( a . Name != "" )
95+ comp . SetArchiveName ( a . Name ) ;
96+ if ( a . CompressionType . Equals ( "zstd" , StringComparison . CurrentCultureIgnoreCase ) ) {
97+ var zstd = new ZstdProvider ( ) ;
98+ var b = MiniCli . Parse < ZstdCompressArgs > ( arglist ) ;
99+ zstd . CompressionLevel = b . CompressionLevel ;
100+ zstd . DictCapacity = b . DictionarySize ;
101+ comp . SetCompressor ( zstd ) ;
102+ }
103+ else {
104+ comp . SetCompressor ( new StoreProvider ( ) ) ;
105+ }
106+ if ( a . Force ) {
107+ comp . SetForce ( true ) ;
108+ }
109+ comp . Compress ( ) ;
110+ //.SetCompressor(new ZstdProvider(Compressor.MaxCompressionLevel));
111+ }
112+ }
113+ }
0 commit comments