use chrono::{DateTime, FixedOffset};
use macros_process_mining::register_binding;
use crate::core::event_data::object_centric::{
linked_ocel::{
slim_linked_ocel::{EventIndex, ObjectIndex},
LinkedOCELAccess, SlimLinkedOCEL,
},
OCELAttributeValue, OCELEvent, OCELObject, OCELType, OCELTypeAttribute,
};
use crate::core::OCEL;
#[register_binding]
fn locel_new() -> SlimLinkedOCEL {
SlimLinkedOCEL::new()
}
#[register_binding]
fn locel_add_event_type(
ocel: &mut SlimLinkedOCEL,
event_type: String,
#[bind(default)] attributes: Vec<OCELTypeAttribute>,
) {
ocel.add_event_type(&event_type, attributes);
}
#[register_binding]
fn locel_add_object_type(
ocel: &mut SlimLinkedOCEL,
object_type: String,
#[bind(default)] attributes: Vec<OCELTypeAttribute>,
) {
ocel.add_object_type(&object_type, attributes);
}
#[register_binding]
fn locel_add_event(
ocel: &mut SlimLinkedOCEL,
event_type: String,
time: DateTime<FixedOffset>,
#[bind(default)] id: Option<String>,
#[bind(default)] attributes: Vec<OCELAttributeValue>,
#[bind(default)] relationships: Vec<(String, ObjectIndex)>,
) -> Option<EventIndex> {
ocel.add_event(&event_type, time, id, attributes, relationships)
}
#[register_binding]
fn locel_add_object(
ocel: &mut SlimLinkedOCEL,
object_type: String,
#[bind(default)] id: Option<String>,
#[bind(default)] attributes: Vec<Vec<(DateTime<FixedOffset>, OCELAttributeValue)>>,
#[bind(default)] relationships: Vec<(String, ObjectIndex)>,
) -> Option<ObjectIndex> {
ocel.add_object(&object_type, id, attributes, relationships)
}
#[register_binding]
fn locel_add_e2o(
ocel: &mut SlimLinkedOCEL,
event: EventIndex,
object: ObjectIndex,
qualifier: String,
) -> bool {
ocel.add_e2o(event, object, qualifier)
}
#[register_binding]
fn locel_add_o2o(
ocel: &mut SlimLinkedOCEL,
from_obj: ObjectIndex,
to_obj: ObjectIndex,
qualifier: String,
) -> bool {
ocel.add_o2o(from_obj, to_obj, qualifier)
}
#[register_binding]
fn locel_delete_e2o(ocel: &mut SlimLinkedOCEL, event: EventIndex, object: ObjectIndex) -> bool {
ocel.delete_e2o(&event, &object)
}
#[register_binding]
fn locel_delete_o2o(ocel: &mut SlimLinkedOCEL, from_obj: ObjectIndex, to_obj: ObjectIndex) -> bool {
ocel.delete_o2o(&from_obj, &to_obj)
}
#[register_binding]
fn locel_get_ev_types(ocel: &SlimLinkedOCEL) -> Vec<String> {
ocel.get_ev_types().map(str::to_string).collect()
}
#[register_binding]
fn locel_get_ob_types(ocel: &SlimLinkedOCEL) -> Vec<String> {
ocel.get_ob_types().map(str::to_string).collect()
}
#[register_binding]
fn locel_get_ev_type(ocel: &SlimLinkedOCEL, ev_type: String) -> Option<OCELType> {
ocel.get_ev_type(&ev_type).cloned()
}
#[register_binding]
fn locel_get_ob_type(ocel: &SlimLinkedOCEL, ob_type: String) -> Option<OCELType> {
ocel.get_ob_type(&ob_type).cloned()
}
#[register_binding]
fn locel_get_evs_of_type(ocel: &SlimLinkedOCEL, ev_type: String) -> Vec<EventIndex> {
ocel.get_evs_of_type(&ev_type).copied().collect()
}
#[register_binding]
fn locel_get_obs_of_type(ocel: &SlimLinkedOCEL, ob_type: String) -> Vec<ObjectIndex> {
ocel.get_obs_of_type(&ob_type).copied().collect()
}
#[register_binding]
fn locel_get_ev_by_id(ocel: &SlimLinkedOCEL, ev_id: String) -> Option<EventIndex> {
ocel.get_ev_by_id(&ev_id)
}
#[register_binding]
fn locel_get_ob_by_id(ocel: &SlimLinkedOCEL, ob_id: String) -> Option<ObjectIndex> {
ocel.get_ob_by_id(&ob_id)
}
#[register_binding]
fn locel_get_ev_id(ocel: &SlimLinkedOCEL, ev: EventIndex) -> String {
ocel.get_ev_id(&ev).to_string()
}
#[register_binding]
fn locel_get_ob_id(ocel: &SlimLinkedOCEL, ob: ObjectIndex) -> String {
ocel.get_ob_id(&ob).to_string()
}
#[register_binding]
fn locel_get_ev_type_of(ocel: &SlimLinkedOCEL, ev: EventIndex) -> String {
ocel.get_ev_type_of(&ev).to_string()
}
#[register_binding]
fn locel_get_ob_type_of(ocel: &SlimLinkedOCEL, ob: ObjectIndex) -> String {
ocel.get_ob_type_of(&ob).to_string()
}
#[register_binding]
fn locel_get_ev_time(ocel: &SlimLinkedOCEL, ev: EventIndex) -> DateTime<FixedOffset> {
*ocel.get_ev_time(&ev)
}
#[register_binding]
fn locel_get_e2o(ocel: &SlimLinkedOCEL, ev: EventIndex) -> Vec<(String, ObjectIndex)> {
ocel.get_e2o(&ev)
.map(|(q, o)| (q.to_string(), *o))
.collect()
}
#[register_binding]
fn locel_get_e2o_rev(ocel: &SlimLinkedOCEL, ob: ObjectIndex) -> Vec<(String, EventIndex)> {
ocel.get_e2o_rev(&ob)
.map(|(q, e)| (q.to_string(), *e))
.collect()
}
#[register_binding]
fn locel_get_o2o(ocel: &SlimLinkedOCEL, ob: ObjectIndex) -> Vec<(String, ObjectIndex)> {
ocel.get_o2o(&ob)
.map(|(q, o)| (q.to_string(), *o))
.collect()
}
#[register_binding]
fn locel_get_o2o_rev(ocel: &SlimLinkedOCEL, ob: ObjectIndex) -> Vec<(String, ObjectIndex)> {
ocel.get_o2o_rev(&ob)
.map(|(q, o)| (q.to_string(), *o))
.collect()
}
#[register_binding]
fn locel_get_full_ev(ocel: &SlimLinkedOCEL, ev: EventIndex) -> OCELEvent {
ocel.get_full_ev(&ev).into_owned()
}
#[register_binding]
fn locel_get_full_ob(ocel: &SlimLinkedOCEL, ob: ObjectIndex) -> OCELObject {
ocel.get_full_ob(&ob).into_owned()
}
#[register_binding]
fn locel_get_ev_attr_val(
ocel: &SlimLinkedOCEL,
ev: EventIndex,
attr_name: String,
) -> Option<OCELAttributeValue> {
ocel.get_ev_attr_val(&ev, &attr_name).cloned()
}
#[register_binding]
fn locel_get_ob_attr_vals(
ocel: &SlimLinkedOCEL,
ob: ObjectIndex,
attr_name: String,
) -> Vec<(DateTime<FixedOffset>, OCELAttributeValue)> {
ocel.get_ob_attr_vals(&ob, &attr_name)
.map(|(t, v)| (*t, v.clone()))
.collect()
}
#[register_binding]
fn locel_construct_ocel(ocel: &SlimLinkedOCEL) -> OCEL {
ocel.construct_ocel()
}