use crate::common::chunk::ChunkId;
use crate::import::{ImportType, ResolvedModule};
use meshed::prelude::*;
use serde::{Deserialize, Serialize};
use std::borrow::Cow;
use std::collections::HashSet;
use std::fmt::{Display, Formatter};
use crate::rc::RefCount;
pub struct IncludedModuleNames(pub HashSet<String>);
pub type ModuleChunks = HashSet<ChunkId>;
impl IncludedModuleNames {
pub fn included_name_suffix(&self, pattern: impl AsRef<str>) -> Option<&String> {
self.0.iter().find(|name| name.ends_with(pattern.as_ref()))
}
pub fn included_names_contains(&self, pattern: impl AsRef<str>) -> Option<&String> {
self.0.iter().find(|name| name.contains(pattern.as_ref()))
}
}
#[derive(Deserialize, Debug, Hash, Eq, PartialEq, Ord, PartialOrd, Serialize)]
#[serde(transparent)]
pub struct ModuleIdentifier(pub RefCount<str>);
impl Clone for ModuleIdentifier {
fn clone(&self) -> Self {
Self(RefCount::clone(&self.0))
}
}
impl Display for ModuleIdentifier {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
Display::fmt(&self.0, f)
}
}
impl Identity for ModuleIdentifier {}
#[derive(Deserialize, Serialize, Debug)]
#[serde(transparent)]
pub struct ModuleName(pub RefCount<str>);
impl Default for ModuleName {
fn default() -> Self {
Self("".into())
}
}
impl Display for ModuleName {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
<str as Display>::fmt(&self.0, f)
}
}
impl Clone for ModuleName {
fn clone(&self) -> Self {
Self(RefCount::clone(&self.0))
}
}
#[derive(Deserialize, Debug, Default)]
#[serde(transparent)]
pub struct ModuleId(u32);
#[derive(Deserialize, Debug, Default)]
#[serde(transparent)]
pub struct RelativeModulePath<'a>(#[serde(borrow)] Cow<'a, str>);
pub trait Modules<T>: Query<ModuleIdentifier, T>
where
T: Module,
{
}
pub trait Module:
Identifiable<ModuleIdentifier>
+ Edges<ModuleIdentifier, (ImportType, ResolvedModule)>
+ ExtractData<IncludedModuleNames>
+ ExtractData<ModuleChunks>
+ Label<Label = ModuleName>
{
}