mirror of
https://github.com/perstarkse/minne.git
synced 2026-05-28 02:19:34 +02:00
refactor: extract serde helpers from stored_object! macro
Move FlexibleIdVisitor, deserialize_flexible_id, and four datetime serde helpers from repeating inside every macro expansion into a shared common/src/storage/types/serde_helpers.rs module. 14 macro invocations × 6 items = ~84 fewer redundant function definitions. Fragile cross-module imports (file_info::deserialize_flexible_id etc.) are updated to point to the canonical module.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
use crate::storage::types::{file_info::deserialize_flexible_id, user::User, StoredObject};
|
use crate::storage::types::{serde_helpers::deserialize_flexible_id, user::User, StoredObject};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{error::AppError, storage::db::SurrealDbClient};
|
use crate::{error::AppError, storage::db::SurrealDbClient};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::storage::types::file_info::deserialize_flexible_id;
|
use crate::storage::types::serde_helpers::deserialize_flexible_id;
|
||||||
use crate::{error::AppError, storage::db::SurrealDbClient};
|
use crate::{error::AppError, storage::db::SurrealDbClient};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#![allow(clippy::module_name_repetitions)]
|
#![allow(clippy::module_name_repetitions)]
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
use crate::stored_object;
|
use crate::stored_object;
|
||||||
|
|
||||||
#[derive(Deserialize, Debug, Clone, Serialize, PartialEq)]
|
#[derive(Deserialize, Debug, Clone, Serialize, PartialEq)]
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#![allow(clippy::unsafe_derive_deserialize)]
|
#![allow(clippy::unsafe_derive_deserialize)]
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
pub mod serde_helpers;
|
||||||
pub mod analytics;
|
pub mod analytics;
|
||||||
pub mod conversation;
|
pub mod conversation;
|
||||||
pub mod file_info;
|
pub mod file_info;
|
||||||
@@ -25,97 +26,15 @@ pub trait StoredObject: Serialize + for<'de> Deserialize<'de> {
|
|||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! stored_object {
|
macro_rules! stored_object {
|
||||||
($(#[$struct_attr:meta])* $name:ident, $table:expr, {$($(#[$field_attr:meta])* $field:ident: $ty:ty),*}) => {
|
($(#[$struct_attr:meta])* $name:ident, $table:expr, {$($(#[$field_attr:meta])* $field:ident: $ty:ty),*}) => {
|
||||||
use serde::{Deserialize, Deserializer, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use surrealdb::sql::Thing;
|
|
||||||
use $crate::storage::types::StoredObject;
|
use $crate::storage::types::StoredObject;
|
||||||
use serde::de::{self, Visitor};
|
#[allow(unused_imports)]
|
||||||
use std::fmt;
|
use $crate::storage::types::serde_helpers::{
|
||||||
|
deserialize_flexible_id, serialize_datetime, deserialize_datetime,
|
||||||
|
serialize_option_datetime, deserialize_option_datetime,
|
||||||
|
};
|
||||||
use chrono::{DateTime, Utc };
|
use chrono::{DateTime, Utc };
|
||||||
|
|
||||||
struct FlexibleIdVisitor;
|
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for FlexibleIdVisitor {
|
|
||||||
type Value = String;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("a string or a Thing")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: de::Error,
|
|
||||||
{
|
|
||||||
Ok(value.to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: de::Error,
|
|
||||||
{
|
|
||||||
Ok(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
|
|
||||||
where
|
|
||||||
A: de::MapAccess<'de>,
|
|
||||||
{
|
|
||||||
// Try to deserialize as Thing
|
|
||||||
let thing = Thing::deserialize(de::value::MapAccessDeserializer::new(map))?;
|
|
||||||
Ok(thing.id.to_raw())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn deserialize_flexible_id<'de, D>(deserializer: D) -> Result<String, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
deserializer.deserialize_any(FlexibleIdVisitor)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize_datetime<S>(date: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: serde::Serializer,
|
|
||||||
{
|
|
||||||
Into::<surrealdb::sql::Datetime>::into(*date).serialize(serializer)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn deserialize_datetime<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
|
|
||||||
where
|
|
||||||
D: serde::Deserializer<'de>,
|
|
||||||
{
|
|
||||||
let dt = surrealdb::sql::Datetime::deserialize(deserializer)?;
|
|
||||||
Ok(DateTime::<Utc>::from(dt))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
#[allow(clippy::ref_option)]
|
|
||||||
fn serialize_option_datetime<S>(
|
|
||||||
date: &Option<DateTime<Utc>>,
|
|
||||||
serializer: S,
|
|
||||||
) -> Result<S::Ok, S::Error>
|
|
||||||
where
|
|
||||||
S: serde::Serializer,
|
|
||||||
{
|
|
||||||
match date {
|
|
||||||
Some(dt) => serializer
|
|
||||||
.serialize_some(&Into::<surrealdb::sql::Datetime>::into(*dt)),
|
|
||||||
None => serializer.serialize_none(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
#[allow(clippy::ref_option)]
|
|
||||||
fn deserialize_option_datetime<'de, D>(
|
|
||||||
deserializer: D,
|
|
||||||
) -> Result<Option<DateTime<Utc>>, D::Error>
|
|
||||||
where
|
|
||||||
D: serde::Deserializer<'de>,
|
|
||||||
{
|
|
||||||
let value = Option::<surrealdb::sql::Datetime>::deserialize(deserializer)?;
|
|
||||||
Ok(value.map(DateTime::<Utc>::from))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$(#[$struct_attr])*
|
$(#[$struct_attr])*
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
pub struct $name {
|
pub struct $name {
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
use chrono::{DateTime, Utc};
|
||||||
|
use serde::de::{self, Visitor};
|
||||||
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
use std::fmt;
|
||||||
|
use surrealdb::sql::Thing;
|
||||||
|
|
||||||
|
struct FlexibleIdVisitor;
|
||||||
|
|
||||||
|
impl<'de> Visitor<'de> for FlexibleIdVisitor {
|
||||||
|
type Value = String;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str("a string or a Thing")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error,
|
||||||
|
{
|
||||||
|
Ok(value.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: de::Error,
|
||||||
|
{
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
|
||||||
|
where
|
||||||
|
A: de::MapAccess<'de>,
|
||||||
|
{
|
||||||
|
let thing = Thing::deserialize(de::value::MapAccessDeserializer::new(map))?;
|
||||||
|
Ok(thing.id.to_raw())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize_flexible_id<'de, D>(deserializer: D) -> Result<String, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
deserializer.deserialize_any(FlexibleIdVisitor)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn serialize_datetime<S>(date: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
Into::<surrealdb::sql::Datetime>::into(*date).serialize(serializer)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize_datetime<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let dt = surrealdb::sql::Datetime::deserialize(deserializer)?;
|
||||||
|
Ok(DateTime::<Utc>::from(dt))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn serialize_option_datetime<S>(
|
||||||
|
date: &Option<DateTime<Utc>>,
|
||||||
|
serializer: S,
|
||||||
|
) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
match date {
|
||||||
|
Some(dt) => serializer.serialize_some(&Into::<surrealdb::sql::Datetime>::into(*dt)),
|
||||||
|
None => serializer.serialize_none(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize_option_datetime<'de, D>(deserializer: D) -> Result<Option<DateTime<Utc>>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let value = Option::<surrealdb::sql::Datetime>::deserialize(deserializer)?;
|
||||||
|
Ok(value.map(DateTime::<Utc>::from))
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::storage::types::file_info::deserialize_flexible_id;
|
use crate::storage::types::serde_helpers::deserialize_flexible_id;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{error::AppError, storage::db::SurrealDbClient, storage::types::StoredObject};
|
use crate::{error::AppError, storage::db::SurrealDbClient, storage::types::StoredObject};
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ use axum::{
|
|||||||
response::IntoResponse,
|
response::IntoResponse,
|
||||||
};
|
};
|
||||||
use common::storage::types::{
|
use common::storage::types::{
|
||||||
text_content::{deserialize_flexible_id, TextContent},
|
serde_helpers::deserialize_flexible_id,
|
||||||
|
text_content::TextContent,
|
||||||
StoredObject,
|
StoredObject,
|
||||||
};
|
};
|
||||||
use retrieval_pipeline::{RetrievalConfig, SearchResult, SearchTarget, StrategyOutput};
|
use retrieval_pipeline::{RetrievalConfig, SearchResult, SearchTarget, StrategyOutput};
|
||||||
|
|||||||
Reference in New Issue
Block a user