diff --git a/Cargo.lock b/Cargo.lock index 0a1b1ec..8a13570 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -215,6 +215,30 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +[[package]] +name = "hard-xml" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3477ce594ff6d821c38fc3f8d28744b9bac0340c94b152ebb0f8a1fd5b740f54" +dependencies = [ + "hard-xml-derive", + "jetscii", + "lazy_static", + "memchr", + "xmlparser", +] + +[[package]] +name = "hard-xml-derive" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aa4585e2b133d2479ff3f03febd76972234cc04b40cdb374fab11a7f7b797ca" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -273,6 +297,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "jetscii" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47f142fe24a9c9944451e8349de0a56af5f3e7226dc46f3ed4d4ecc0b85af75e" + [[package]] name = "js-sys" version = "0.3.60" @@ -339,6 +369,17 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" +[[package]] +name = "opml" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d41b8c4211bfa2e51d1910dbad2b4740e06486ece44de3fd9c7512f009ff9e99" +dependencies = [ + "hard-xml", + "serde", + "thiserror", +] + [[package]] name = "os_str_bytes" version = "6.3.0" @@ -448,6 +489,26 @@ dependencies = [ "untrusted", ] +[[package]] +name = "serde" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -470,6 +531,7 @@ dependencies = [ "clap", "color-eyre", "indicatif", + "opml", "ureq", ] @@ -515,6 +577,26 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16" +[[package]] +name = "thiserror" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c53f98874615aea268107765aa1ed8f6116782501d18e53d08b471733bea6c85" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b463991b4eab2d801e724172285ec4195c650e8ec79b149e6c2a8e6dd3f783" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" version = "1.1.4" @@ -767,3 +849,9 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "xmlparser" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" diff --git a/Cargo.toml b/Cargo.toml index 3f2517f..4d547a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ path = "source/main.rs" [dependencies] color-eyre = "0.6.2" indicatif = "0.17.1" +opml = "1.1.4" ureq = "2.5.0" [dependencies.clap] diff --git a/source/main.rs b/source/main.rs index 627f3cd..1555aa1 100644 --- a/source/main.rs +++ b/source/main.rs @@ -23,6 +23,10 @@ pub struct Args { #[clap(short, long)] pub appid: Vec, + /// Output the feeds as OPML. + #[clap(long)] + pub opml: bool, + /// The time in milliseconds to sleep between HTTP requests. #[clap(short, long, default_value = "250")] pub timeout: u64, @@ -66,8 +70,17 @@ fn main() -> Result<()> { feeds_to_output = potential_feeds; } + let mut opml_document = opml::OPML::default(); for feed in feeds_to_output { - println!("{feed}"); + if args.opml { + opml_document.add_feed(&feed, &feed); + } else { + println!("{feed}"); + } + } + + if args.opml { + println!("{}", opml_document.to_string()?); } Ok(())