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}