diff --git a/crates/gitnow/src/config.rs b/crates/gitnow/src/config.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/gitnow/src/main.rs b/crates/gitnow/src/main.rs index 3a403c9..f3056c5 100644 --- a/crates/gitnow/src/main.rs +++ b/crates/gitnow/src/main.rs @@ -33,150 +33,7 @@ async fn main() -> anyhow::Result<()> { Ok(()) } -mod config { - use std::path::Path; - - use anyhow::Context; - use serde::{Deserialize, Serialize}; - - #[derive(Debug, Serialize, Deserialize, PartialEq)] - pub struct Config { - #[serde(default)] - pub providers: Providers, - } - - #[derive(Debug, Default, Serialize, Deserialize, PartialEq)] - pub struct Providers { - #[serde(default)] - pub github: Vec, - #[serde(default)] - pub gitea: Vec, - } - - #[derive(Debug, Serialize, Deserialize, PartialEq)] - pub struct GitHub { - #[serde(default)] - pub users: Vec, - #[serde(default)] - pub organisations: Vec, - } - - #[derive(Debug, Serialize, Deserialize, PartialEq)] - pub struct GitHubUser(String); - - #[derive(Debug, Serialize, Deserialize, PartialEq)] - pub struct GitHubOrganisation(String); - - #[derive(Debug, Serialize, Deserialize, PartialEq)] - pub struct Gitea { - #[serde(default)] - pub users: Vec, - #[serde(default)] - pub organisations: Vec, - } - #[derive(Debug, Serialize, Deserialize, PartialEq)] - pub struct GiteaUser(String); - - #[derive(Debug, Serialize, Deserialize, PartialEq)] - pub struct GiteaOrganisation(String); - - impl Config { - pub async fn from_file(file_path: &Path) -> anyhow::Result { - let file_content = tokio::fs::read_to_string(file_path).await?; - - Self::from_string(&file_content) - } - - pub fn from_string(content: &str) -> anyhow::Result { - toml::from_str(content).context("failed to deserialize config file") - } - } - - #[cfg(test)] - mod test { - use super::*; - - #[test] - fn test_can_parse_config() -> anyhow::Result<()> { - let content = r#" - [[providers.github]] - users = ["kjuulh"] - organisations = ["lunarway"] - - [[providers.github]] - users = ["other"] - organisations = ["org"] - - [[providers.gitea]] - users = ["kjuulh"] - organisations = ["lunarway"] - - [[providers.gitea]] - users = ["other"] - organisations = ["org"] - - [[providers.gitea]] - "#; - - let config = Config::from_string(content)?; - - assert_eq!( - Config { - providers: Providers { - github: vec![ - GitHub { - users: vec![GitHubUser("kjuulh".into())], - organisations: vec![GitHubOrganisation("lunarway".into())] - }, - GitHub { - users: vec![GitHubUser("other".into())], - organisations: vec![GitHubOrganisation("org".into())] - } - ], - gitea: vec![ - Gitea { - users: vec![GiteaUser("kjuulh".into())], - organisations: vec![GiteaOrganisation("lunarway".into())] - }, - Gitea { - users: vec![GiteaUser("other".into())], - organisations: vec![GiteaOrganisation("org".into())] - }, - Gitea { - users: vec![], - organisations: vec![] - }, - ] - } - }, - config - ); - - Ok(()) - } - - #[test] - fn test_can_parse_empty_config() -> anyhow::Result<()> { - let content = r#" - # empty file - "#; - - let config = Config::from_string(content)?; - - assert_eq!( - Config { - providers: Providers { - github: vec![], - gitea: vec![] - } - }, - config - ); - - Ok(()) - } - } -} +mod config; mod git_provider { use async_trait::async_trait;