From a58a6fac8e92372debfe5e91b535f3d7acf469de Mon Sep 17 00:00:00 2001 From: Tpt Date: Sat, 10 Jul 2021 21:43:02 +0200 Subject: [PATCH] Migrates from argh to clap --- server/Cargo.toml | 1 + server/src/main.rs | 43 +++++++++++--------- wikibase/Cargo.toml | 2 +- wikibase/src/main.rs | 97 +++++++++++++++++++++++++------------------- 4 files changed, 80 insertions(+), 63 deletions(-) diff --git a/server/Cargo.toml b/server/Cargo.toml index 5e827758..6b6d0130 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -20,6 +20,7 @@ default = ["rocksdb"] argh = "0.1" async-std = { version = "1", features = ["attributes"] } async-h1 = "2" +clap = "2" http-types = "2" oxigraph = { version = "0.2", path="../lib", features = ["http_client"] } rand = "0.8" diff --git a/server/src/main.rs b/server/src/main.rs index d6948761..fa5ea18a 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, @@ -39,28 +39,31 @@ 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) + .required(true), + ) + .get_matches(); + let bind = matches.value_of("bind").unwrap_or("localhost:7878"); + let file = matches.value_of("file").unwrap(); - println!("Listening for requests at http://{}", &args.bind); - http_server(&args.bind, move |request| { - handle_request(request, store.clone()) - }) - .await + let store = Store::open(file)?; + 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/wikibase/Cargo.toml b/wikibase/Cargo.toml index 07bf1352..8d2d447f 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 021fd589..e688f14a 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,57 @@ 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 = RocksDbStore::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) + .required(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").unwrap(); + 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 +96,9 @@ pub async fn main() -> Result<()> { } }) .collect::>(); - let slot = args.slot.clone(); + let slot = matches.value_of("slot"); + + let store = RocksDbStore::open(file)?; let repo = store.clone(); let mut loader = WikibaseLoader::new( repo, @@ -98,12 +114,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: RocksDbStore) -> Result {