#![deny(unsafe_code)]
#![deny(clippy::undocumented_unsafe_blocks)]
#![deny(missing_docs)]
#![warn(clippy::pedantic)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::result_large_err)]
#![allow(clippy::unnecessary_map_or)]
#![allow(clippy::collapsible_if)]
#![allow(clippy::manual_contains)]
#![allow(clippy::unnested_or_patterns)]
#![allow(clippy::match_single_binding)]
#![allow(clippy::redundant_closure_for_method_calls)]
#![allow(clippy::must_use_candidate)]
#![allow(clippy::return_self_not_must_use)]
mod agency_code;
mod any_message;
mod custom_rule_pack;
mod error;
mod interchange;
mod light_message;
mod message;
mod message_type;
mod object_type;
mod parse;
mod platform;
mod pruefidentifikator;
mod release;
mod report;
pub mod builders;
pub mod messages;
pub mod registry;
#[doc(hidden)]
pub(crate) mod generated;
pub use agency_code::AgencyCode;
pub use any_message::AnyMessage;
pub use custom_rule_pack::CustomRulePack;
pub use error::{Error, ProfileError};
pub use interchange::{InterchangeHeader, MessageEnvelope, ParsedInterchange, ReceiptContext};
pub use light_message::LightMessage;
pub use message::EdiEnergyMessage;
pub use message_type::MessageType;
pub use object_type::ObjectType;
pub use parse::{
DEFAULT_MAX_SEGMENT_BYTES, InterchangeIter, ParseConfig, Parser, parse, parse_envelope_only,
parse_interchange,
};
pub use platform::Platform;
pub use pruefidentifikator::Pruefidentifikator;
pub use registry::{ProcessContext, ReleaseRegistry, TRANSITION_GRACE_DAYS, TransitionState};
pub use release::{Release, ReleaseKind, ReleaseTrack};
pub use report::EdiEnergyReport;
pub mod releases {
#[cfg(any(
feature = "aperak",
feature = "comdis",
feature = "contrl",
feature = "iftsta",
feature = "insrpt",
feature = "invoic",
feature = "mscons",
feature = "ordchg",
feature = "orders",
feature = "ordrsp",
feature = "partin",
feature = "pricat",
feature = "quotes",
feature = "remadv",
feature = "reqote",
feature = "utilmd",
feature = "utilts",
))]
pub use crate::generated::releases::*;
}
pub use edifact_rs::{
EdifactDeserialize, EdifactSerialize, ReaderConfig, ValidationIssue, ValidationReport,
ValidationSeverity,
};
pub use report::ValidationIssueSummary;
#[cfg(feature = "aperak")]
pub use messages::aperak::AperakError;
#[cfg(feature = "contrl")]
pub use messages::contrl::{ContrlElementError, ContrlMessageResponse, ContrlSegmentError};
#[cfg(feature = "mscons")]
pub use messages::mscons::{
MsconsDeliveryPoint, MsconsLineItem, MsconsQuantity, MsconsReference, MsconsTimeSeries,
};
#[cfg(feature = "utilmd")]
pub use messages::utilmd::{UtilmdReference, UtilmdTransaction};
#[must_use = "validation result must be checked for errors"]
pub fn validate_and_check_pid(
msg: &impl EdiEnergyMessage,
expected: Pruefidentifikator,
) -> Result<EdiEnergyReport, Error> {
let report = msg.validate()?;
match msg.detect_pruefidentifikator() {
Ok(actual) if actual == expected => Ok(report),
Ok(actual) => {
let mut inner = report.into_inner();
inner.add_error(
edifact_rs::ValidationIssue::new(
edifact_rs::ValidationSeverity::Error,
format!("expected Pruefidentifikator {expected}, found {actual}"),
)
.with_rule_id("EE-PID-001")
.with_segment("BGM"),
);
Ok(EdiEnergyReport::new(inner))
}
Err(_) => {
let mut inner = report.into_inner();
inner.add_error(
edifact_rs::ValidationIssue::new(
edifact_rs::ValidationSeverity::Error,
format!("expected Pruefidentifikator {expected}, but none was found"),
)
.with_rule_id("EE-PID-001")
.with_segment("BGM"),
);
Ok(EdiEnergyReport::new(inner))
}
}
}