refactor: extract file
Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
parent
071cb43510
commit
6cb65e55c1
@ -1,3 +1,5 @@
|
||||
mod project;
|
||||
|
||||
use project::Project;
|
||||
|
||||
#[tokio::main]
|
||||
@ -21,77 +23,3 @@ impl Cuddle {
|
||||
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(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
71
crates/cuddle/src/project.rs
Normal file
71
crates/cuddle/src/project.rs
Normal 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(())
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user