minimal config file parsing
This commit is contained in:
parent
b4e5967845
commit
8fda9c2c3e
8 changed files with 153 additions and 0 deletions
2
modular-recipes/code/recipe-loader/.gitignore
vendored
Normal file
2
modular-recipes/code/recipe-loader/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
/target
|
||||||
|
Cargo.lock
|
||||||
9
modular-recipes/code/recipe-loader/Cargo.toml
Normal file
9
modular-recipes/code/recipe-loader/Cargo.toml
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "recipe-loader"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
clap = { version = "^4.5.26", features = ["derive"] }
|
||||||
|
recipe = {path="../recipe"}
|
||||||
|
toml = "0.8.19"
|
||||||
58
modular-recipes/code/recipe-loader/src/main.rs
Normal file
58
modular-recipes/code/recipe-loader/src/main.rs
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
use clap::Parser;
|
||||||
|
use recipe::TomlRecipe;
|
||||||
|
|
||||||
|
use std::fs;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
struct Cli {
|
||||||
|
#[arg(long)]
|
||||||
|
/// the recipe you'd like to make (needs to be in the repo)
|
||||||
|
recipe: String,
|
||||||
|
|
||||||
|
#[arg(long)]
|
||||||
|
/// the repository of your recipes
|
||||||
|
repo: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct LoadedEnvironment {
|
||||||
|
recipes: Vec<TomlRecipe>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for LoadedEnvironment {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
recipes: Vec::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LoadedEnvironment {
|
||||||
|
pub fn new(repo: &Path) -> Self {
|
||||||
|
let paths = fs::read_dir(repo).unwrap();
|
||||||
|
let mut env = LoadedEnvironment::default();
|
||||||
|
for path in paths {
|
||||||
|
let path = path.expect("Failed to unwrap path");
|
||||||
|
env.recipes.push(TomlRecipe::new(&path.path()))
|
||||||
|
}
|
||||||
|
env
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn print(&self) {
|
||||||
|
for recipe in &self.recipes {
|
||||||
|
recipe.print();
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let cli = Cli::parse();
|
||||||
|
let repo = Path::new(&cli.repo);
|
||||||
|
let env = LoadedEnvironment::new(repo);
|
||||||
|
env.print();
|
||||||
|
// let recipe = TomlRecipe::default();
|
||||||
|
// recipe.print();
|
||||||
|
|
||||||
|
println!("{}", repo.display());
|
||||||
|
}
|
||||||
2
modular-recipes/code/recipe/.gitignore
vendored
Normal file
2
modular-recipes/code/recipe/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
/target
|
||||||
|
Cargo.lock
|
||||||
8
modular-recipes/code/recipe/Cargo.toml
Normal file
8
modular-recipes/code/recipe/Cargo.toml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "recipe"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
serde = { version = "1.0.215", features = ["derive"] }
|
||||||
|
toml = "0.8.19"
|
||||||
8
modular-recipes/code/recipe/src/lib.rs
Normal file
8
modular-recipes/code/recipe/src/lib.rs
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
mod recipe;
|
||||||
|
|
||||||
|
pub use crate::recipe::TomlRecipe;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
}
|
||||||
64
modular-recipes/code/recipe/src/recipe.rs
Normal file
64
modular-recipes/code/recipe/src/recipe.rs
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::fs;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq, Deserialize, Serialize, Debug)]
|
||||||
|
pub struct Input {}
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq, Deserialize, Serialize, Debug)]
|
||||||
|
pub struct Output {}
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq, Deserialize, Serialize, Debug)]
|
||||||
|
pub struct Dependency {}
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq, Deserialize, Serialize, Debug)]
|
||||||
|
pub struct Config {}
|
||||||
|
|
||||||
|
// Recipe which can get read out of a toml file
|
||||||
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
pub struct TomlRecipe {
|
||||||
|
name: String,
|
||||||
|
inputs: BTreeMap<String, Input>,
|
||||||
|
outputs: BTreeMap<String, Output>,
|
||||||
|
dependencies: BTreeMap<String, Dependency>,
|
||||||
|
config: Config,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for TomlRecipe {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
name: String::new(),
|
||||||
|
inputs: BTreeMap::new(),
|
||||||
|
outputs: BTreeMap::new(),
|
||||||
|
dependencies: BTreeMap::new(),
|
||||||
|
config: Config {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TomlRecipe {
|
||||||
|
pub fn new(config_file: &Path) -> Self {
|
||||||
|
let file: String = fs::read_to_string(&config_file).expect("Could not read input file");
|
||||||
|
let recipe: TomlRecipe = toml::from_str(&file).expect("Could not parse TOML file");
|
||||||
|
recipe
|
||||||
|
}
|
||||||
|
pub fn print(&self) {
|
||||||
|
println!("{} ---------------", self.name);
|
||||||
|
println!(" INPUTS");
|
||||||
|
for (key, _) in &self.inputs {
|
||||||
|
println!(" * {}", key);
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
println!(" OUTPUTS");
|
||||||
|
for (key, _) in &self.outputs {
|
||||||
|
println!(" * {}", key);
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
println!(" DEPENDENCIES");
|
||||||
|
for (key, _) in &self.dependencies {
|
||||||
|
println!(" * {}", key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
modular-recipes/code/todo.md
Normal file
2
modular-recipes/code/todo.md
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
1. recipe visualizer using mermaid or some other charting library
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue