diff --git a/server/Cargo.toml b/server/Cargo.toml index 83a22537..bc3473cd 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -15,6 +15,7 @@ edition = "2018" argh = "0.1" async-std = { version = "1", features = ["attributes"] } async-h1 = "2" +clap = "2" http-types = "2" oxigraph = { version = "0.3.0-dev", path="../lib", features = ["http_client"] } rand = "0.8" diff --git a/server/src/main.rs b/server/src/main.rs index 3963fdfa..38d6954b 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -9,12 +9,12 @@ unused_qualifications )] -use argh::FromArgs; use async_std::future::Future; use async_std::io::Read; use async_std::net::{TcpListener, TcpStream}; use async_std::prelude::*; use async_std::task::{block_on, spawn}; +use clap::{App, Arg}; use http_types::content::ContentType; use http_types::{ bail_status, format_err_status, headers, Error, Method, Mime, Request, Response, Result, @@ -35,28 +35,35 @@ const HTML_ROOT_PAGE: &str = include_str!("../templates/query.html"); const LOGO: &str = include_str!("../logo.svg"); const SERVER: &str = concat!("Oxigraph/", env!("CARGO_PKG_VERSION")); -#[derive(FromArgs)] -/// Oxigraph SPARQL server -struct Args { - /// specify a server socket to bind using the format $(HOST):$(PORT) - #[argh(option, short = 'b', default = "\"localhost:7878\".to_string()")] - bind: String, - - /// directory in which persist the data - #[argh(option, short = 'f')] - file: String, -} - #[async_std::main] pub async fn main() -> Result<()> { - let args: Args = argh::from_env(); - let store = Store::open(args.file)?; + let matches = App::new("Oxigraph SPARQL server") + .arg( + Arg::with_name("bind") + .short("b") + .long("bind") + .help("Sets a custom config file") + .takes_value(true), + ) + .arg( + Arg::with_name("file") + .short("f") + .long("file") + .help("directory in which persist the data") + .takes_value(true), + ) + .get_matches(); + let bind = matches.value_of("bind").unwrap_or("localhost:7878"); + let file = matches.value_of("file"); - println!("Listening for requests at http://{}", &args.bind); - http_server(&args.bind, move |request| { - handle_request(request, store.clone()) - }) - .await + let store = if let Some(file) = file { + Store::open(file) + } else { + Store::new() + }?; + + println!("Listening for requests at http://{}", &bind); + http_server(&bind, move |request| handle_request(request, store.clone())).await } async fn handle_request(request: Request, store: Store) -> Result { diff --git a/testsuite/Cargo.toml b/testsuite/Cargo.toml index 7bc6f773..ccbf5231 100644 --- a/testsuite/Cargo.toml +++ b/testsuite/Cargo.toml @@ -13,7 +13,7 @@ publish = false [dependencies] anyhow = "1" -argh = "0.1" +clap = "2" chrono = "0.4" oxigraph = { version = "0.3.0-dev", path="../lib" } text-diff = "0.4" diff --git a/testsuite/src/main.rs b/testsuite/src/main.rs index 6cd6b885..0b19bb70 100644 --- a/testsuite/src/main.rs +++ b/testsuite/src/main.rs @@ -1,26 +1,25 @@ use anyhow::Result; -use argh::FromArgs; +use clap::{App, Arg}; use oxigraph_testsuite::evaluator::TestEvaluator; use oxigraph_testsuite::manifest::TestManifest; use oxigraph_testsuite::parser_evaluator::register_parser_tests; use oxigraph_testsuite::report::build_report; use oxigraph_testsuite::sparql_evaluator::register_sparql_tests; -#[derive(FromArgs)] -/// Oxigraph testsuite runner -struct Args { - /// URI of the testsuite manifest to run - #[argh(positional)] - manifest: String, -} - fn main() -> Result<()> { - let args: Args = argh::from_env(); + let matches = App::new("Oxigraph testsuite runner") + .arg( + Arg::with_name("manifest") + .help("URI of the testsuite manifest to run") + .takes_value(true) + .required(true), + ) + .get_matches(); let mut evaluator = TestEvaluator::default(); register_parser_tests(&mut evaluator); register_sparql_tests(&mut evaluator); - let manifest = TestManifest::new(vec![args.manifest]); + let manifest = TestManifest::new(vec![matches.value_of("manifest").unwrap()]); let results = evaluator.evaluate(manifest)?; print!("{}", build_report(results)); Ok(()) diff --git a/wikibase/Cargo.toml b/wikibase/Cargo.toml index e095ea13..dc7bdd49 100644 --- a/wikibase/Cargo.toml +++ b/wikibase/Cargo.toml @@ -11,7 +11,7 @@ SPARQL server based on Oxigraph for Wikibase instances edition = "2018" [dependencies] -argh = "0.1" +clap = "2" async-std = { version = "1", features = ["attributes"] } async-h1 = "2" chrono = "0.4" diff --git a/wikibase/src/main.rs b/wikibase/src/main.rs index 3f06019f..ca413f42 100644 --- a/wikibase/src/main.rs +++ b/wikibase/src/main.rs @@ -10,11 +10,11 @@ )] use crate::loader::WikibaseLoader; -use argh::FromArgs; use async_std::future::Future; use async_std::net::{TcpListener, TcpStream}; use async_std::prelude::*; use async_std::task::spawn; +use clap::{App, Arg}; use http_types::content::ContentType; use http_types::{ bail_status, format_err_status, headers, Error, Method, Mime, Request, Response, Result, @@ -33,43 +33,56 @@ mod loader; const MAX_SPARQL_BODY_SIZE: u64 = 1_048_576; const SERVER: &str = concat!("Oxigraph/", env!("CARGO_PKG_VERSION")); -#[derive(FromArgs)] -/// Oxigraph SPARQL server for Wikibase -struct Args { - /// specify a server socket to bind using the format $(HOST):$(PORT) - #[argh(option, short = 'b', default = "\"localhost:7878\".to_string()")] - bind: String, - - /// directory in which persist the data - #[argh(option, short = 'f')] - file: String, - - #[argh(option)] - /// base URL of the MediaWiki API like https://www.wikidata.org/w/api.php - mediawiki_api: String, - - #[argh(option)] - /// base URL of MediaWiki like https://www.wikidata.org/wiki/ - mediawiki_base_url: String, - - #[argh(option)] - /// namespaces ids to load like "0,120" - namespaces: Option, - - #[argh(option)] - /// slot to load like "mediainfo". Could not be use with namespaces - slot: Option, -} - #[async_std::main] pub async fn main() -> Result<()> { - let args: Args = argh::from_env(); - - let store = Store::open(args.file)?; - let mediawiki_api = args.mediawiki_api.clone(); - let mediawiki_base_url = args.mediawiki_base_url.clone(); - let namespaces = args - .namespaces + let matches = App::new("Oxigraph SPARQL server for Wikibase") + .arg( + Arg::with_name("bind") + .short("b") + .long("bind") + .help("Sets a custom config file") + .takes_value(true), + ) + .arg( + Arg::with_name("file") + .short("f") + .long("file") + .help("directory in which persist the data") + .takes_value(true), + ) + .arg( + Arg::with_name("mediawiki_api") + .long("mediawiki_api") + .help("base URL of the MediaWiki API like https://www.wikidata.org/w/api.php") + .takes_value(true) + .required(true), + ) + .arg( + Arg::with_name("mediawiki_base_url") + .long("mediawiki_base_url") + .help("base URL of MediaWiki like https://www.wikidata.org/wiki/") + .takes_value(true) + .required(true), + ) + .arg( + Arg::with_name("namespaces") + .long("namespaces") + .help("namespaces ids to load like '0,120'") + .takes_value(true), + ) + .arg( + Arg::with_name("slot") + .long("slot") + .help("slot to load like 'mediainfo'. Could not be use with namespaces") + .takes_value(true), + ) + .get_matches(); + let bind = matches.value_of("bind").unwrap_or("localhost:7878"); + let file = matches.value_of("file"); + let mediawiki_api = matches.value_of("mediawiki_api").unwrap(); + let mediawiki_base_url = matches.value_of("mediawiki_base_url").unwrap(); + let namespaces = matches + .value_of("namespaces") .as_deref() .unwrap_or("") .split(',') @@ -82,7 +95,13 @@ pub async fn main() -> Result<()> { } }) .collect::>(); - let slot = args.slot.clone(); + let slot = matches.value_of("slot").clone(); + + let store = if let Some(file) = file { + Store::open(file) + } else { + Store::new() + }?; let repo = store.clone(); let mut loader = WikibaseLoader::new( repo, @@ -98,12 +117,9 @@ pub async fn main() -> Result<()> { loader.update_loop(); }); - println!("Listening for requests at http://{}", &args.bind); + println!("Listening for requests at http://{}", &bind); - http_server(&args.bind, move |request| { - handle_request(request, store.clone()) - }) - .await + http_server(&bind, move |request| handle_request(request, store.clone())).await } async fn handle_request(request: Request, store: Store) -> Result {