use std::collections::BTreeSet;
use serde::{Deserialize, Serialize};
use crate::model::names::{ApplicationName, MakeVariableName, vocabulary};
vocabulary! {
#[derive(Default)]
pub enum ManifestSource : "manifest source" {
#[default]
AppSrc => "app_src",
ErlangMk => "erlang_mk",
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub enum ManifestUnreadable {
Missing,
UnexpandedVariable(MakeVariableName),
ParseFailed,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ManifestDeps {
Listed(BTreeSet<ApplicationName>),
Unreadable(ManifestUnreadable),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AppManifest {
pub name: ApplicationName,
pub source: ManifestSource,
pub requires: ManifestDeps,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReadManifest {
name: ApplicationName,
source: ManifestSource,
requires: BTreeSet<ApplicationName>,
}
impl ReadManifest {
#[must_use]
pub fn name(&self) -> &ApplicationName {
&self.name
}
#[must_use]
pub fn source(&self) -> ManifestSource {
self.source
}
#[must_use]
pub fn requires(&self) -> &BTreeSet<ApplicationName> {
&self.requires
}
}
impl AppManifest {
pub fn into_read(self) -> Result<ReadManifest, ManifestUnreadable> {
match self.requires {
ManifestDeps::Listed(requires) => Ok(ReadManifest {
name: self.name,
source: self.source,
requires,
}),
ManifestDeps::Unreadable(reason) => Err(reason),
}
}
}