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;
|
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(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
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