use ews_proc_macros::operation_response;
use serde::Deserialize;
use xml_struct::XmlSerialize;
use crate::types::common::{BaseItemId, Message, MessageDisposition, PathToElement};
use crate::{Items, MESSAGES_NS_URI};
#[derive(Clone, Debug, XmlSerialize)]
#[xml_struct(default_ns = MESSAGES_NS_URI)]
#[operation_response(UpdateItemResponseMessage)]
pub struct UpdateItem {
#[xml_struct(attribute)]
pub message_disposition: MessageDisposition,
#[xml_struct(attribute)]
pub conflict_resolution: Option<ConflictResolution>,
pub item_changes: Vec<ItemChange>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct UpdateItemResponseMessage {
pub items: Items,
}
#[derive(Clone, Copy, Debug, Default, XmlSerialize)]
#[xml_struct(text)]
pub enum ConflictResolution {
NeverOverwrite,
#[default]
AutoResolve,
AlwaysOverwrite,
}
#[derive(Clone, Debug, XmlSerialize)]
pub struct ItemChange {
#[xml_struct(ns_prefix = "t")]
pub item_change: ItemChangeInner,
}
#[derive(Clone, Debug, XmlSerialize)]
pub struct ItemChangeInner {
#[xml_struct(flatten, ns_prefix = "t")]
pub item_id: BaseItemId,
#[xml_struct(ns_prefix = "t")]
pub updates: Updates,
}
#[derive(Clone, Debug, XmlSerialize)]
pub struct Updates {
#[xml_struct(flatten, ns_prefix = "t")]
pub inner: Vec<ItemChangeDescription>,
}
#[derive(Clone, Debug, XmlSerialize)]
#[xml_struct(variant_ns_prefix = "t")]
pub enum ItemChangeDescription {
SetItemField {
#[xml_struct(flatten, ns_prefix = "t")]
field_uri: PathToElement,
#[xml_struct(ns_prefix = "t")]
message: Message,
},
}