anni_workspace/
config.rs

1use crate::WorkspaceError;
2use anni_common::fs;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5use std::path::{Path, PathBuf};
6
7#[derive(Serialize, Deserialize)]
8#[serde(deny_unknown_fields)]
9pub struct WorkspaceConfig {
10    #[serde(rename = "workspace")]
11    inner: WorkspaceConfigInner,
12    #[serde(rename = "library")]
13    libraries: HashMap<String, LibraryConfig>,
14}
15
16#[derive(Serialize, Deserialize)]
17#[serde(rename_all = "kebab-case")]
18#[serde(deny_unknown_fields)]
19pub struct WorkspaceConfigInner {
20    publish_to: Option<String>,
21}
22
23#[derive(Serialize, Deserialize)]
24#[serde(deny_unknown_fields)]
25pub struct LibraryConfig {
26    pub path: PathBuf,
27    pub layers: Option<usize>,
28}
29
30impl WorkspaceConfig {
31    pub fn new<P>(root: P) -> Result<Self, WorkspaceError>
32    where
33        P: AsRef<Path>,
34    {
35        let data = fs::read_to_string(root.as_ref().join("config.toml"))?;
36        Ok(toml::from_str(&data)?)
37    }
38
39    pub fn publish_to(&self) -> Option<&LibraryConfig> {
40        self.inner
41            .publish_to
42            .as_ref()
43            .and_then(|p| self.libraries.get(p))
44    }
45
46    #[allow(dead_code)]
47    pub fn get_library(&self, name: &str) -> Option<&LibraryConfig> {
48        self.libraries.get(name)
49    }
50}