use crate::{
base::{FetchedItem, Item, ItemVersion},
sync::status::ItemState,
};
#[derive(Clone, Debug, PartialEq)]
pub struct ItemWithData {
pub state: ItemState,
pub data: Item,
}
#[derive(Clone, Debug, PartialEq)]
pub struct ItemSource {
pub state: ItemState,
pub data: Option<Item>,
}
impl From<ItemWithData> for ItemSource {
fn from(item: ItemWithData) -> Self {
ItemSource {
state: item.state,
data: Some(item.data),
}
}
}
#[derive(Clone)]
pub enum SideState {
Changed { state: ItemState, data: Item },
Unchanged { state: ItemState },
}
impl SideState {
#[must_use]
pub fn from_fetched(FetchedItem { href, item, etag }: FetchedItem) -> Self {
Self::Changed {
state: ItemState {
version: ItemVersion::new(href, etag),
uid: item.ident(),
hash: item.hash(),
},
data: item,
}
}
#[must_use]
pub fn unchanged(state: ItemState) -> Self {
Self::Unchanged { state }
}
#[must_use]
pub fn state(&self) -> &ItemState {
match self {
Self::Changed { state, .. } | Self::Unchanged { state } => state,
}
}
}
impl From<SideState> for ItemVersion {
fn from(value: SideState) -> Self {
match value {
SideState::Changed { state, .. } | SideState::Unchanged { state } => state.version,
}
}
}
impl From<SideState> for ItemSource {
fn from(value: SideState) -> Self {
match value {
SideState::Changed { state, data } => ItemSource {
state,
data: Some(data),
},
SideState::Unchanged { state } => ItemSource { state, data: None },
}
}
}