From fe9546fbff5576a04b3350d27c11d0542adfda54 Mon Sep 17 00:00:00 2001 From: newt Date: Sat, 7 Sep 2024 02:42:48 +0100 Subject: [PATCH] feat: output to csv file --- Cargo.lock | 24 ++++++++++++++++++++++++ Cargo.toml | 3 +++ dependencies.csv | 10 ++++++++++ src/dependency.rs | 24 ++++++++++++++++++++++++ src/main.rs | 41 +++++++++++++++-------------------------- 5 files changed, 76 insertions(+), 26 deletions(-) create mode 100644 dependencies.csv create mode 100644 src/dependency.rs diff --git a/Cargo.lock b/Cargo.lock index e131386..091876f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -148,13 +148,37 @@ version = "0.1.0" dependencies = [ "cargo_toml", "color-eyre", + "csv", "forgejo-api", "futures", "semver", + "serde", + "serde_json", "tokio", "url", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "deranged" version = "0.3.11" diff --git a/Cargo.toml b/Cargo.toml index 90e8880..d63441a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,11 @@ edition = "2021" [dependencies] cargo_toml = "0.20.4" color-eyre = "0.6.3" +csv = "1.3.0" forgejo-api = "0.4.1" futures = "0.3.30" semver = "1.0.23" +serde = { version = "1.0.210", features = ["derive"] } +serde_json = "1.0.128" tokio = { version = "1.40.0", features = ["full"] } url = "2.5.2" diff --git a/dependencies.csv b/dependencies.csv new file mode 100644 index 0000000..f070fa0 --- /dev/null +++ b/dependencies.csv @@ -0,0 +1,10 @@ +name,version,source +color-eyre,0.6.3,0 +tracing,0.1.40,0 +tracing-subscriber,0.3.18,0 +cargo_toml,0.20.4,0 +forgejo-api,0.4.1,0 +futures,0.3.30,0 +semver,1.0.23,0 +tokio,1.40.0,0 +url,2.5.2,0 diff --git a/src/dependency.rs b/src/dependency.rs new file mode 100644 index 0000000..163d036 --- /dev/null +++ b/src/dependency.rs @@ -0,0 +1,24 @@ +use serde::Serialize; +use std::borrow::Cow; + +#[derive(Debug, Clone, Copy)] +#[repr(i8)] +pub enum DependencySource { + Crates = 0, +} + +impl Serialize for DependencySource { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_i8(*self as i8) + } +} + +#[derive(Debug, Serialize)] +pub struct Dependency { + pub name: Cow<'static, str>, + pub version: Cow<'static, str>, + pub source: DependencySource, +} diff --git a/src/main.rs b/src/main.rs index 3dcfa35..eebb603 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,34 +1,18 @@ +mod dependency; + use cargo_toml::{Dependency as Crate, Manifest}; use color_eyre::{eyre::eyre, Result}; +use csv::Writer; +use dependency::{Dependency, DependencySource}; use forgejo_api::{ structs::{OrgListReposQuery, RepoGetRawFileQuery}, Forgejo, }; use futures::future::join_all; use semver::Version; -use std::{borrow::Cow, env}; +use std::env; use url::Url; -#[derive(Debug)] -enum DependencySource { - Crates, -} - -#[derive(Debug)] -pub struct Dependency { - name: Cow<'static, str>, - version: Version, - source: DependencySource, -} - -impl Dependency { - pub fn get_url(&self) -> String { - match self.source { - DependencySource::Crates => format!("https://crates.io/crates/{}", self.name), - } - } -} - #[tokio::main] async fn main() -> Result<()> { color_eyre::install()?; @@ -96,15 +80,20 @@ async fn main() -> Result<()> { .iter() .map(|(name, version)| Dependency { name: name.clone().into(), - version: version.clone(), + version: version.to_string().into(), source: DependencySource::Crates, }) .collect(); - println!( - "{:?}", - crates.iter().map(|c| c.get_url()).collect::>() - ); + // write the dependencies to a file + let mut dependencies = vec![]; + dependencies.extend(crates); + let file = std::fs::File::create("dependencies.csv")?; + let mut wtr = Writer::from_writer(file); + for dependency in dependencies { + wtr.serialize(dependency)?; + } + wtr.flush()?; Ok(()) }