anni-workspace 0.2.2

A library to operate on anni workspace.
Documentation
use crate::WorkspaceError;
use anni_common::fs;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::{Path, PathBuf};

#[derive(Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WorkspaceConfig {
    #[serde(rename = "workspace")]
    inner: WorkspaceConfigInner,
    #[serde(rename = "library")]
    libraries: HashMap<String, LibraryConfig>,
}

#[derive(Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[serde(deny_unknown_fields)]
pub struct WorkspaceConfigInner {
    publish_to: Option<String>,
}

#[derive(Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct LibraryConfig {
    pub path: PathBuf,
    pub layers: Option<usize>,
}

impl WorkspaceConfig {
    pub fn new<P>(root: P) -> Result<Self, WorkspaceError>
    where
        P: AsRef<Path>,
    {
        let data = fs::read_to_string(root.as_ref().join("config.toml"))?;
        Ok(toml::from_str(&data)?)
    }

    pub fn publish_to(&self) -> Option<&LibraryConfig> {
        self.inner
            .publish_to
            .as_ref()
            .and_then(|p| self.libraries.get(p))
    }

    #[allow(dead_code)]
    pub fn get_library(&self, name: &str) -> Option<&LibraryConfig> {
        self.libraries.get(name)
    }
}