From 432327338f0d94f242be1f55c10f1e12f4135c2a Mon Sep 17 00:00:00 2001 From: Matteo Settenvini Date: Mon, 4 Jul 2022 15:01:17 +0200 Subject: [PATCH] Get list of all recipes from server --- Cargo.lock | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 7 ++ src/main.rs | 62 ++++++++++++---- 3 files changed, 264 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c20e145..47bd39d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "anyhow" version = "1.0.58" @@ -67,6 +73,26 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "time", + "winapi", +] + +[[package]] +name = "chunked_transfer" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff857943da45f546682664a79488be82e69e43c1a7a2307679ab9afb3a66d2e" + [[package]] name = "ci_info" version = "0.10.2" @@ -117,8 +143,10 @@ version = "0.0.0" dependencies = [ "anyhow", "base64", + "chrono", "clap", "directories", + "minicaldav", "reqwest", "rusty-hook", "serde", @@ -144,6 +172,15 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + [[package]] name = "darling" version = "0.13.4" @@ -227,6 +264,16 @@ dependencies = [ "instant", ] +[[package]] +name = "flate2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -329,7 +376,7 @@ checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -553,6 +600,28 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "minicaldav" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb263a7d12c40d5f200dda93b3665b9ae714d4fe64a6467938c92d974a579edb" +dependencies = [ + "base64", + "log", + "ureq", + "url", + "xmltree", +] + +[[package]] +name = "miniz_oxide" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.8.4" @@ -561,7 +630,7 @@ checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys", ] @@ -645,6 +714,25 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab250442c86f1850815b5d268639dff018c0627022bc1940eb2d642ca1ce12f0" +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.13.1" @@ -851,6 +939,33 @@ dependencies = [ "winreg", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rustls" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + [[package]] name = "rusty-hook" version = "0.11.2" @@ -888,6 +1003,16 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "security-framework" version = "2.6.1" @@ -970,6 +1095,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "strsim" version = "0.10.0" @@ -1036,6 +1167,17 @@ dependencies = [ "syn", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -1172,6 +1314,30 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "ureq" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9399fa2f927a3d327187cbd201480cee55bee6ac5d3c77dd27f0c6814cff16d5" +dependencies = [ + "base64", + "chunked_transfer", + "encoding_rs", + "flate2", + "log", + "once_cell", + "rustls", + "url", + "webpki", + "webpki-roots", +] + [[package]] name = "url" version = "2.2.2" @@ -1211,6 +1377,12 @@ dependencies = [ "try-lock", ] +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1307,6 +1479,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d8de8415c823c8abd270ad483c6feeac771fad964890779f9a8cb24fbbc1bf" +dependencies = [ + "webpki", +] + [[package]] name = "widestring" version = "0.5.1" @@ -1395,3 +1586,18 @@ checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] diff --git a/Cargo.toml b/Cargo.toml index 27288c4..8b130fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,10 @@ version = "1.0" [dependencies.base64] version = "0.13" +[dependencies.chrono] +version = "0.4" +features = ["serde"] + [dependencies.clap] version = "3.2" features = ["cargo"] @@ -29,6 +33,9 @@ features = ["cargo"] [dependencies.directories] version = "4.0" +[dependencies.minicaldav] +version = "0.2" + [dependencies.reqwest] version = "0.11" features = ["json", "blocking"] diff --git a/src/main.rs b/src/main.rs index 1f81074..01de7b6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +use serde::Deserialize; + // SPDX-FileCopyrightText: 2022 Matteo Settenvini // SPDX-License-Identifier: AGPL-3.0-or-later @@ -8,6 +10,7 @@ use { self::config::Config, anyhow::anyhow, base64::write::EncoderWriter as Base64Encoder, + chrono::{DateTime, Utc}, clap::{arg, command, ArgMatches, Command}, reqwest::Url, std::io::Write, @@ -28,9 +31,18 @@ fn parse_args() -> ArgMatches { .subcommand( Command::new("import") .about("Import the given URLs into NextCloud's cookbook") - .arg(server_arg) + .arg(server_arg.clone()) .arg(arg!( ... "One or more URLs each pointing to page with a recipe to import in NextCloud")), ) + .subcommand( + Command::new("schedule") + .about("") + .arg(server_arg.clone()) + .arg(arg!(-d --days "") + .value_parser(clap::builder::RangedU64ValueParser::::new().range(1..)) + .required(false) + .default_value("7")) + ) .get_matches() } @@ -53,18 +65,7 @@ async fn main() -> anyhow::Result<()> { })?; } Some(("import", sub_matches)) => { - let server_name = sub_matches - .get_one::("server") - .unwrap_or_else(|| { - let servers = &configuration.credentials.servers; - match servers.len() { - 0 => panic!("No NextCloud server set up yet, use '{} init' first", env!("CARGO_BIN_NAME")), - 1 => servers.iter().next().unwrap().0, - _ => panic!("More than one NextCloud server set up, use the '--server' option to specify which one to use. Known servers: {:#?}", servers.keys().collect::>()), - } - }); - - let api_client = ApiClient::new(&server_name, &configuration)?; + let api_client = get_api_client(&sub_matches, &configuration)?; for url in sub_matches .get_many::("url") .expect("At least one url is required") @@ -80,12 +81,47 @@ async fn main() -> anyhow::Result<()> { println!("{:#?}", response); // TODO } } + Some(("schedule", sub_matches)) => { + let api_client = get_api_client(&sub_matches, &configuration)?; + let recipes = api_client + .client + .get(api_client.base_url.join("apps/cookbook/api/recipes")?) + .send() + .await?; + println!("{:#?}", recipes.json::>().await?); // TODO + } _ => unreachable!("Exhausted list of subcommands and subcommand_required prevents `None`"), }; Ok(()) } +#[derive(Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +struct Recipe { + #[serde(rename = "recipe_id")] + recipe_id: u32, + name: String, + keywords: String, + date_created: DateTime, + date_modified: DateTime, +} + +fn get_api_client(sub_matches: &ArgMatches, configuration: &Config) -> anyhow::Result { + let server_name = sub_matches + .get_one::("server") + .unwrap_or_else(|| { + let servers = &configuration.credentials.servers; + match servers.len() { + 0 => panic!("No NextCloud server set up yet, use '{} init' first", env!("CARGO_BIN_NAME")), + 1 => servers.iter().next().unwrap().0, + _ => panic!("More than one NextCloud server set up, use the '--server' option to specify which one to use. Known servers: {:#?}", servers.keys().collect::>()), + } + }); + + ApiClient::new(&server_name, &configuration) +} + struct ApiClient { pub base_url: Url, pub client: reqwest::Client,