use edifact_rs::OwnedSegment;
use crate::{CustomRulePack, EdiEnergyReport, Error, MessageType, Pruefidentifikator, Release};
pub trait EdiEnergyMessage: Send + Sync {
#[must_use]
fn try_message_type(&self) -> Option<MessageType>;
fn detect_release(&self) -> Result<&Release, Error>;
fn message_ref(&self) -> &str;
fn detect_pruefidentifikator(&self) -> Result<Pruefidentifikator, Error>;
#[must_use = "validation result must be checked for errors"]
fn validate(&self) -> Result<EdiEnergyReport, Error>;
#[must_use = "validation result must be checked for errors"]
fn validate_against(&self, release: &Release) -> Result<EdiEnergyReport, Error>;
#[must_use = "validation result must be checked for errors"]
fn validate_with_pack(&self, extra: CustomRulePack) -> Result<EdiEnergyReport, Error>;
#[must_use = "validation result must be checked for errors"]
fn validate_with_context(
&self,
ctx: &crate::registry::ProcessContext,
) -> Result<EdiEnergyReport, Error> {
let release = self.detect_release()?;
let Some(mt) = self.try_message_type() else {
return self.validate_on_date(ctx.date());
};
if !ctx.is_acceptable(mt, release) {
return Err(Error::ProfileNotFound {
message_type: mt,
release: release.clone(),
});
}
self.validate_on_date(ctx.date())
}
#[must_use = "validation result must be checked for errors"]
fn validate_on_date(&self, reference_date: time::Date) -> Result<EdiEnergyReport, Error>;
fn serialize(&self) -> Result<Vec<u8>, Error>;
fn segments(&self) -> &[OwnedSegment];
}