use std::collections::HashMap;
use anyhow::{format_err, Error};
use serde::{Deserialize, Serialize};
use crate::{license::LicenseType, license::TextData};
#[derive(Serialize, Deserialize)]
pub(crate) struct LicenseEntry {
pub original: TextData,
pub aliases: Vec<String>,
pub headers: Vec<TextData>,
pub alternates: Vec<TextData>,
}
#[derive(Default, Serialize, Deserialize)]
pub struct Store {
pub(crate) licenses: HashMap<String, LicenseEntry>,
}
impl LicenseEntry {
pub fn new(original: TextData) -> LicenseEntry {
LicenseEntry {
original,
aliases: Vec::new(),
alternates: Vec::new(),
headers: Vec::new(),
}
}
}
impl Store {
pub fn new() -> Store {
Store {
licenses: HashMap::new(),
}
}
pub fn len(&self) -> usize {
self.licenses.len()
}
pub fn is_empty(&self) -> bool {
self.licenses.is_empty()
}
pub fn licenses(&self) -> impl Iterator<Item = &String> {
self.licenses.keys()
}
pub fn get_original(&self, name: &str) -> Option<&TextData> {
Some(&self.licenses.get(name)?.original)
}
pub fn add_license(&mut self, name: String, data: TextData) {
let entry = LicenseEntry::new(data);
self.licenses.insert(name, entry);
}
pub fn add_variant(
&mut self,
name: &str,
variant: LicenseType,
data: TextData,
) -> Result<(), Error> {
let entry = self
.licenses
.get_mut(name)
.ok_or_else(|| format_err!("license {} not present in store", name))?;
match variant {
LicenseType::Alternate => {
entry.alternates.push(data);
}
LicenseType::Header => {
entry.headers.push(data);
}
_ => {
return Err(format_err!("variant type not applicable for add_variant"));
}
};
Ok(())
}
pub fn aliases(&self, name: &str) -> Result<&Vec<String>, Error> {
let entry = self
.licenses
.get(name)
.ok_or_else(|| format_err!("license {} not present in store", name))?;
Ok(&entry.aliases)
}
pub fn set_aliases(&mut self, name: &str, aliases: Vec<String>) -> Result<(), Error> {
let entry = self
.licenses
.get_mut(name)
.ok_or_else(|| format_err!("license {} not present in store", name))?;
entry.aliases = aliases;
Ok(())
}
}