use clap::Parser; #[derive(Parser, Debug)] #[clap( name = "kittybox-mf2", author = "Vika ", version = env!("CARGO_PKG_VERSION"), about = "Fetch HTML and turn it into MF2-JSON" )] struct Args { #[clap(value_parser)] url: url::Url, } #[derive(thiserror::Error, Debug)] enum Error { #[error("http request error: {0}")] Http(#[from] reqwest::Error), #[error("microformats error: {0}")] Microformats(#[from] microformats::Error), #[error("json error: {0}")] Json(#[from] serde_json::Error), #[error("url parse error: {0}")] UrlParse(#[from] url::ParseError), } #[tokio::main] async fn main() -> Result<(), Error> { use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Registry}; let tracing_registry = Registry::default() .with(EnvFilter::from_default_env()) .with( #[cfg(debug_assertions)] tracing_tree::HierarchicalLayer::new(2) .with_bracketed_fields(true) .with_indent_lines(true) .with_verbose_exit(true), #[cfg(not(debug_assertions))] tracing_subscriber::fmt::layer().json() .with_ansi(std::io::IsTerminal::is_terminal(&std::io::stdout().lock())) ); tracing_registry.init(); let args = Args::parse(); let http: reqwest::Client = { #[allow(unused_mut)] let mut builder = reqwest::Client::builder() .user_agent(concat!( env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION") )); builder.build().unwrap() }; let response = http.get(args.url.clone()).send().await?; let text = response.text().await?; let mf2 = microformats::from_html(text.as_ref(), args.url)?; println!("{}", serde_json::to_string_pretty(&mf2)?); Ok(()) }