diff --git a/bin/jadb.dart b/bin/jadb.dart index 3e17cb0..c18f930 100644 --- a/bin/jadb.dart +++ b/bin/jadb.dart @@ -1,39 +1,101 @@ +import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; import 'package:args/args.dart'; +import 'package:args/command_runner.dart'; import 'package:jadb/_data_ingestion/jmdict/parser.dart'; import 'package:jadb/_data_ingestion/kanjidic/parser.dart'; import 'package:jadb/_data_ingestion/radkfile/parser.dart'; +import 'package:jadb/search.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import 'package:sqlite3/open.dart'; -ArgParser argParser() { - final parser = ArgParser(); - parser.addOption( +void addLibsqliteArg(ArgParser argParser) { + argParser.addOption( 'libsqlite', help: 'Path to the SQLite library. This is used to load the SQLite library dynamically.', valueHelp: 'PATH', defaultsTo: Platform.environment['LIBSQLITE_PATH'], ); - return parser; } -Future main(List arguments) async { - final parser = argParser(); - final ArgResults args = parser.parse(arguments); +void addJadbArg(ArgParser argParser) { + argParser.addOption( + 'jadb', + abbr: 'f', + help: 'Path to the SQLite database file.', + valueHelp: 'PATH', + mandatory: true, + ); +} - if (args.option('libsqlite') == null) { - print(parser.usage); - exit(64); +class CreateDb extends Command { + final name = "create-db"; + final description = "Create the database"; + + CreateDb() { + addLibsqliteArg(argParser); } - final db = await createDatabaseFactoryFfi(ffiInit: () { - open.overrideForAll(() => DynamicLibrary.open(args.option('libsqlite')!)); - }).openDatabase(Directory.current.uri.resolve('jadb.sqlite').path); + Future run() async { + if (argResults!.option('libsqlite') == null) { + print(argParser.usage); + exit(64); + } - await addDataFromJMdict(db); - await addDataFromRADKFILE(db); - await addDataFromKANJIDIC(db); + final db = await createDatabaseFactoryFfi(ffiInit: () { + open.overrideForAll( + () => DynamicLibrary.open(argResults!.option('libsqlite')!)); + }).openDatabase(Directory.current.uri.resolve('jadb.sqlite').path); + + await addDataFromJMdict(db); + await addDataFromRADKFILE(db); + await addDataFromKANJIDIC(db); + } +} + +class QueryKanji extends Command { + final name = "query-kanji"; + final description = "Query the database for kanji data"; + + QueryKanji() { + addLibsqliteArg(argParser); + addJadbArg(argParser); + } + + Future run() async { + if (argResults!.option('libsqlite') == null || + !argResults!.wasParsed('jadb')) { + print(argParser.usage); + exit(64); + } + + final db = await createDatabaseFactoryFfi(ffiInit: () { + open.overrideForAll( + () => DynamicLibrary.open(argResults!.option('libsqlite')!)); + }).openDatabase( + Directory.current.uri.resolve(argResults!.option('jadb')!).path); + + final result = await JaDBConnection(db).searchKanji('漢'); + + if (result == null) { + print("No such kanji"); + } else { + print(JsonEncoder.withIndent(' ').convert(result.toJson())); + } + } +} + +Future main(List args) async { + final runner = CommandRunner( + 'jadb', + "CLI tool to help creating and testing the jadb database", + ); + + runner.addCommand(CreateDb()); + runner.addCommand(QueryKanji()); + + runner.run(args); } diff --git a/bin/test_tool.dart b/bin/test_tool.dart deleted file mode 100644 index b3fcb5c..0000000 --- a/bin/test_tool.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'dart:ffi'; -import 'dart:io'; - -import 'package:args/args.dart'; -import 'package:jadb/search.dart'; -import 'package:sqflite_common_ffi/sqflite_ffi.dart'; -import 'package:sqlite3/open.dart'; - -ArgParser argParser() { - final parser = ArgParser(); - - parser.addOption( - 'libsqlite', - help: - 'Path to the SQLite library. This is used to load the SQLite library dynamically.', - valueHelp: 'PATH', - defaultsTo: Platform.environment['LIBSQLITE_PATH'], - ); - - parser.addOption( - 'jadb', - help: 'Path to the SQLite database file.', - valueHelp: 'PATH', - mandatory: true, - ); - - return parser; -} - -Future main(List arguments) async { - final parser = argParser(); - final ArgResults args = parser.parse(arguments); - - if (args.option('libsqlite') == null || !args.wasParsed('jadb')) { - print(parser.usage); - exit(64); - } - - final db = await createDatabaseFactoryFfi(ffiInit: () { - open.overrideForAll(() => DynamicLibrary.open(args.option('libsqlite')!)); - }).openDatabase(Directory.current.uri.resolve(args.option('jadb')!).path); - - final result = await JaDBConnection(db).searchKanji('漢'); - - if (result == null) { - print("No such kanji"); - } else { - print(result.toJson().toString()); - } -} diff --git a/nix/database.nix b/nix/database.nix index c5ec517..2409d32 100644 --- a/nix/database.nix +++ b/nix/database.nix @@ -16,6 +16,7 @@ stdenvNoCC.mkDerivation { database-tool sqlite ]; + buildPhase = '' runHook preBuild @@ -28,7 +29,7 @@ stdenvNoCC.mkDerivation { sqlite3 jadb.sqlite < "$migration" done - "${lib.getExe database-tool}" --libsqlite "${sqlite.out}/lib/libsqlite3.so" + "${lib.getExe database-tool}" create-db --libsqlite "${sqlite.out}/lib/libsqlite3.so" runHook postBuild ''; diff --git a/pubspec.yaml b/pubspec.yaml index f74e069..c031263 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,6 @@ dev_dependencies: executables: jadb: jadb - test: test_tool topics: - database