use cratefield_manifest::{AccessMap, TablePrivacy, TablePrivacyMap};
use cratefield_tables::Schema;
use serde::{Deserialize, Serialize};
use crate::access::TableApi;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Declared {
pub tables: Schema,
pub access: AccessMap,
pub privacy: TablePrivacyMap,
}
impl Declared {
#[must_use]
pub fn into_apis(self) -> Vec<TableApi> {
let Self {
tables,
access,
privacy,
} = self;
tables
.tables
.into_iter()
.filter_map(|table| {
let level = *access.get(&table.name)?;
let subject = match privacy.get(&table.name) {
Some(TablePrivacy::Personal { subject, .. }) => Some(subject.clone()),
_ => None,
};
Some(TableApi {
table,
access: level,
subject,
})
})
.collect()
}
}
pub fn parse(json: &str) -> Result<Vec<TableApi>, String> {
serde_json::from_str::<Declared>(json)
.map(Declared::into_apis)
.map_err(|err| format!("the generated table declaration could not be read: {err}"))
}