use jiff::Timestamp;
use url::Url;
use super::error::McsdError;
use ihe_atna::balp::{
Coded, DESTINATION_ROLE, Direction, Entity, EventKind, Exchange, HISTORY_TYPE, Outcome, Peer,
REST, SEARCH, SOURCE_ROLE, request_text,
};
use ihe_atna::user::OnBehalfOf;
pub const ITI_90: Coded = Coded::fixed(
ihe_atna::balp::IHE_TRANSACTIONS,
"ITI-90",
"Find Matching Care Services",
);
pub const ITI_91: Coded = Coded::fixed(
ihe_atna::balp::IHE_TRANSACTIONS,
"ITI-91",
"Request Care Services Updates",
);
#[must_use]
pub fn query() -> EventKind {
EventKind {
profile: "https://profiles.ihe.net/ITI/mCSD/StructureDefinition/IHE.mCSD.Audit.CareServices.Query",
event_type: REST,
subtypes: vec![ITI_90, SEARCH],
action: "E",
client: SOURCE_ROLE,
server: DESTINATION_ROLE,
}
}
#[must_use]
pub fn updates() -> EventKind {
EventKind {
profile: "https://profiles.ihe.net/ITI/mCSD/StructureDefinition/IHE.mCSD.Audit.CareServices.Updates",
event_type: REST,
subtypes: vec![HISTORY_TYPE, ITI_91],
action: "E",
client: SOURCE_ROLE,
server: DESTINATION_ROLE,
}
}
pub(super) fn exchange<T>(
kind: EventKind,
base: &Url,
request: &Url,
result: &Result<T, McsdError>,
) -> Exchange {
let outcome = match result {
Ok(_) => Outcome::Success,
Err(error) if error.answered() => Outcome::MinorFailure,
Err(_) => Outcome::SeriousFailure,
};
Exchange {
kind,
recorded: Timestamp::now(),
outcome,
outcome_description: None,
direction: Direction::Sent {
server: Peer::server(base),
},
on_behalf: OnBehalfOf::System,
entities: vec![Entity::Query(request_text(request))],
security: Vec::new(),
}
}