mirror of
https://github.com/Astatin3/unshell.git
synced 2026-06-09 06:47:59 -06:00
Implement clap parsing for unshell metadata
This commit is contained in:
@@ -5,16 +5,17 @@ use std::{
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
|
||||
use unshell_lib::debug;
|
||||
use unshell_lib::{debug, info};
|
||||
|
||||
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
|
||||
pub struct ComponentMetadata {
|
||||
struct ComponentMetadata {
|
||||
name: String,
|
||||
description: Option<String>,
|
||||
version: Option<String>,
|
||||
authors: Option<Vec<String>>,
|
||||
|
||||
// Struct to contain build information
|
||||
#[serde(default)]
|
||||
build_config: BuildConfig,
|
||||
|
||||
// Other components that can be pointed to by this component
|
||||
@@ -23,7 +24,7 @@ pub struct ComponentMetadata {
|
||||
// config: Option<HashMap<String, ConfigStructField>>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
|
||||
#[derive(Default, Debug, Clone, serde::Deserialize, serde::Serialize)]
|
||||
struct BuildConfig {
|
||||
// Cargo feature list of a component
|
||||
// (Name, Description)
|
||||
@@ -58,7 +59,13 @@ enum ConfigStructField {
|
||||
// ...
|
||||
}
|
||||
|
||||
pub fn load_config(path: &PathBuf) -> Result<Vec<ComponentMetadata>, Box<dyn Error>> {
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ComponentState {
|
||||
metadata: ComponentMetadata,
|
||||
path: PathBuf,
|
||||
}
|
||||
|
||||
pub fn load_config(path: &PathBuf) -> Result<Vec<ComponentState>, Box<dyn Error>> {
|
||||
let path_absolute = fs::canonicalize(path.clone())?;
|
||||
debug!("Loading data from path: `{}`", path_absolute);
|
||||
|
||||
@@ -68,11 +75,16 @@ pub fn load_config(path: &PathBuf) -> Result<Vec<ComponentMetadata>, Box<dyn Err
|
||||
// Load config from String
|
||||
let config = toml::from_str::<ComponentMetadata>(&config_str)?;
|
||||
|
||||
if config.child_components.is_empty() {
|
||||
Ok(vec![config])
|
||||
} else {
|
||||
let parent_path = path_absolute.parent().expect("Path must have parent");
|
||||
info!("Loaded component `{}`", config.name);
|
||||
|
||||
let parent_path = path_absolute.parent().expect("Path must have parent");
|
||||
|
||||
if config.child_components.is_empty() {
|
||||
Ok(vec![ComponentState {
|
||||
metadata: config,
|
||||
path: PathBuf::from(parent_path),
|
||||
}])
|
||||
} else {
|
||||
let mut config_vec = vec![];
|
||||
|
||||
// Load each child component
|
||||
@@ -82,7 +94,13 @@ pub fn load_config(path: &PathBuf) -> Result<Vec<ComponentMetadata>, Box<dyn Err
|
||||
config_vec.append(&mut config);
|
||||
}
|
||||
|
||||
config_vec.insert(0, config);
|
||||
config_vec.insert(
|
||||
0,
|
||||
ComponentState {
|
||||
metadata: config,
|
||||
path: PathBuf::from(parent_path),
|
||||
},
|
||||
);
|
||||
|
||||
Ok(config_vec)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user