You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.9 KiB
Rust
85 lines
1.9 KiB
Rust
use crate::constants::{
|
|
CONTENT_TYPE_MAPPINGS, CONTENT_TYPE_TAG_PARENTS, CONTENT_TYPE_TAG_SIBLINGS,
|
|
HYDRUS_TYPE_CONTENT_UPDATE,
|
|
};
|
|
use crate::hydrus_serializable::HydrusSerializable;
|
|
use crate::{Error, Result};
|
|
use serde::de::DeserializeOwned;
|
|
use serde::Deserialize;
|
|
use serde_json::Value;
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct HydrusContentUpdate(Vec<ContentUpdateEntries>);
|
|
|
|
impl HydrusSerializable for HydrusContentUpdate {
|
|
fn type_id() -> u64 {
|
|
HYDRUS_TYPE_CONTENT_UPDATE
|
|
}
|
|
}
|
|
|
|
impl HydrusContentUpdate {
|
|
pub fn take<U: ContentUpdateTrait>(
|
|
&mut self,
|
|
) -> Result<Option<Vec<ContentUpdatesAndAction<U>>>> {
|
|
if let Some(index) = self.0.iter().position(|e| e.content_type == U::type_id()) {
|
|
let entry = self.0.swap_remove(index);
|
|
|
|
serde_json::from_value(entry.entries).map_err(Error::from)
|
|
} else {
|
|
Ok(None)
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct ContentUpdateEntries {
|
|
pub content_type: u64,
|
|
pub entries: Value,
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct ContentUpdatesAndAction<T> {
|
|
pub action: u64,
|
|
pub updates: Vec<T>,
|
|
}
|
|
|
|
pub trait ContentUpdateTrait: DeserializeOwned {
|
|
fn type_id() -> u64;
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct MappingsUpdateEntry {
|
|
pub tag_id: u64,
|
|
pub hash_ids: Vec<u64>,
|
|
}
|
|
|
|
impl ContentUpdateTrait for MappingsUpdateEntry {
|
|
fn type_id() -> u64 {
|
|
CONTENT_TYPE_MAPPINGS
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct TagParentsUpdateEntry {
|
|
pub child_id: u64,
|
|
pub parent_id: u64,
|
|
}
|
|
|
|
impl ContentUpdateTrait for TagParentsUpdateEntry {
|
|
fn type_id() -> u64 {
|
|
CONTENT_TYPE_TAG_PARENTS
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize)]
|
|
pub struct TagSiblingsUpdateEntry {
|
|
pub tag_id: u64,
|
|
pub sibling_id: u64,
|
|
}
|
|
|
|
impl ContentUpdateTrait for TagSiblingsUpdateEntry {
|
|
fn type_id() -> u64 {
|
|
CONTENT_TYPE_TAG_SIBLINGS
|
|
}
|
|
}
|