use crate::common::import::{ImportString, ImportType};
use crate::common::module::{ModuleId, ModuleIdentifier, ModuleName, RelativeModulePath};
use empty_type::{Empty, EmptyType};
use serde::{Deserialize, Deserializer};
use std::borrow::Cow;
use std::ops::Deref;
#[derive(Debug, Default)]
pub struct Reasons<'a> {
reasons: Vec<Reason<'a>>,
}
impl<'a> Deref for Reasons<'a> {
type Target = Vec<Reason<'a>>;
fn deref(&self) -> &Self::Target {
&self.reasons
}
}
impl<'de: 'a, 'a> Deserialize<'de> for Reasons<'a> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
type Container<'a> = Vec<Empty<Reason<'a>>>;
let value = <Container<'a> as Deserialize>::deserialize(deserializer)?;
let resolved = value
.into_iter()
.filter(|module| module.module_identifier.is_some())
.map(Empty::resolve)
.collect();
Ok(Self { reasons: resolved })
}
}
#[derive(Deserialize, Debug, EmptyType)]
#[serde(rename_all = "camelCase", default)]
#[empty(bounds = "'a", deserialize)]
pub struct Reason<'a> {
#[serde(borrow)]
#[empty(fail_safe)]
pub loc: Cow<'a, str>,
pub module: RelativeModulePath<'a>,
pub module_id: Option<ModuleId>,
pub module_name: ModuleName,
pub resolved_module: ModuleName,
pub module_identifier: ModuleIdentifier,
pub r#type: ImportType,
#[empty(fail_safe)]
pub user_request: ImportString<'a>,
}