use super::variables::VariableMutability;
use crate::{context::facts::Facts, TypeId, VariableId};
use source_map::Span;
#[derive(Debug)]
pub struct NamePair<'a> {
pub value: &'a str,
pub r#as: &'a str,
pub position: Span,
}
pub enum ImportKind<'a, T: Iterator<Item = NamePair<'a>>> {
Parts(T),
All {
under: &'a str,
position: Span,
},
Everything,
}
pub struct SynthesisedModule<M> {
pub content: M,
pub exported: Exported,
pub facts: Facts,
}
#[derive(Clone, Debug, Default, binary_serialize_derive::BinarySerializable)]
pub struct Exported {
pub default: Option<TypeId>,
pub named: Vec<(String, (VariableId, VariableMutability))>,
pub named_types: Vec<(String, TypeId)>,
}
pub enum TypeOrVariable {
ExportedVariable((VariableId, VariableMutability)),
Type(TypeId),
}
impl Exported {
pub(crate) fn get_export(&self, want: &str) -> Option<TypeOrVariable> {
self.named
.iter()
.find_map(|(export, value)| {
(export == want).then_some(TypeOrVariable::ExportedVariable((value.0, value.1)))
})
.or_else(|| {
self.named_types.iter().find_map(|(export, value)| {
(export == want).then_some(TypeOrVariable::Type(*value))
})
})
}
}
pub struct InvalidModule;
pub type FinalModule<M> = Result<SynthesisedModule<M>, InvalidModule>;