refactor: extract file

Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
Kasper Juul Hermansen 2024-08-23 23:22:35 +02:00
parent 071cb43510
commit 6cb65e55c1
Signed by: kjuulh
GPG Key ID: D85D7535F18F35FA
2 changed files with 73 additions and 74 deletions

View File

@ -1,3 +1,5 @@
mod project;
use project::Project; use project::Project;
#[tokio::main] #[tokio::main]
@ -21,77 +23,3 @@ impl Cuddle {
Ok(Self { project }) Ok(Self { project })
} }
} }
mod project {
use std::env::current_dir;
use serde::Deserialize;
const CUDDLE_FILE_NAME: &str = "cuddle.toml";
pub struct Project {
config: Config,
}
impl Project {
pub fn new(config: Config) -> Self {
Self { config }
}
pub fn from_file(content: &str) -> anyhow::Result<Self> {
let config: Config = toml::from_str(&content)?;
Ok(Self::new(config))
}
pub async fn from_current_path() -> anyhow::Result<Option<Self>> {
let cur_dir = current_dir()?;
let cuddle_file = cur_dir.join(CUDDLE_FILE_NAME);
if !cuddle_file.exists() {
// We may want to recursively search for the file (towards root)
return Ok(None);
}
let cuddle_project_file = tokio::fs::read_to_string(cuddle_file).await?;
Ok(Some(Self::from_file(&cuddle_project_file)?))
}
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct Config {
project: ProjectConfig,
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct ProjectConfig {
name: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_can_parse_simple_file() -> anyhow::Result<()> {
let project = Project::from_file(
r##"
[project]
name = "simple_file"
"##,
)?;
assert_eq!(
Config {
project: ProjectConfig {
name: "simple_file".into()
}
},
project.config
);
Ok(())
}
}
}

View File

@ -0,0 +1,71 @@
use std::env::current_dir;
use serde::Deserialize;
const CUDDLE_FILE_NAME: &str = "cuddle.toml";
pub struct Project {
config: Config,
}
impl Project {
pub fn new(config: Config) -> Self {
Self { config }
}
pub fn from_file(content: &str) -> anyhow::Result<Self> {
let config: Config = toml::from_str(&content)?;
Ok(Self::new(config))
}
pub async fn from_current_path() -> anyhow::Result<Option<Self>> {
let cur_dir = current_dir()?;
let cuddle_file = cur_dir.join(CUDDLE_FILE_NAME);
if !cuddle_file.exists() {
// We may want to recursively search for the file (towards root)
return Ok(None);
}
let cuddle_project_file = tokio::fs::read_to_string(cuddle_file).await?;
Ok(Some(Self::from_file(&cuddle_project_file)?))
}
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct Config {
project: ProjectConfig,
}
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct ProjectConfig {
name: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_can_parse_simple_file() -> anyhow::Result<()> {
let project = Project::from_file(
r##"
[project]
name = "simple_file"
"##,
)?;
assert_eq!(
Config {
project: ProjectConfig {
name: "simple_file".into()
}
},
project.config
);
Ok(())
}
}