use cfgmatic_merge::MergeReport;
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use crate::domain::{ParsedContent, Result, SourceMetadata};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SourceLayer {
pub metadata: SourceMetadata,
pub priority: i32,
pub registration_index: usize,
pub content: ParsedContent,
}
impl SourceLayer {
#[must_use]
pub fn source_id(&self) -> String {
self.metadata.display_id()
}
}
#[derive(Debug, Clone)]
pub struct LoadResult {
pub content: ParsedContent,
pub loaded_count: usize,
pub loaded_sources: Vec<String>,
pub failed_sources: Vec<(String, String)>,
pub processing_time_ms: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LoadReport {
pub layers: Vec<SourceLayer>,
pub merged: ParsedContent,
pub merge_report: MergeReport,
pub loaded_count: usize,
pub loaded_sources: Vec<String>,
pub failed_sources: Vec<(String, String)>,
pub processing_time_ms: u64,
}
impl LoadReport {
#[must_use]
pub fn into_load_result(self) -> LoadResult {
LoadResult {
content: self.merged,
loaded_count: self.loaded_count,
loaded_sources: self.loaded_sources,
failed_sources: self.failed_sources,
processing_time_ms: self.processing_time_ms,
}
}
pub fn to_type<T: DeserializeOwned>(&self) -> Result<T> {
self.merged.to_type()
}
}
impl LoadResult {
#[must_use]
pub const fn new(content: ParsedContent) -> Self {
Self {
content,
loaded_count: 0,
loaded_sources: Vec::new(),
failed_sources: Vec::new(),
processing_time_ms: 0,
}
}
#[must_use]
pub const fn content(&self) -> &ParsedContent {
&self.content
}
#[must_use]
pub const fn loaded_count(&self) -> usize {
self.loaded_count
}
#[must_use]
pub const fn has_failures(&self) -> bool {
!self.failed_sources.is_empty()
}
pub fn to_type<T: DeserializeOwned>(&self) -> Result<T> {
self.content.to_type()
}
}