mirror of
https://github.com/Drop-OSS/drop.git
synced 2026-07-26 17:54:44 +10:00
@@ -26,6 +26,7 @@ bincode_2 = { package = "bincode", version = "2.0", features = ["serde"], option
|
|||||||
postcard_1_0 = { package = "postcard", version = "1.0.8", features = ["alloc"], optional = true }
|
postcard_1_0 = { package = "postcard", version = "1.0.8", features = ["alloc"], optional = true }
|
||||||
rmp_serde_1_3 = { package = "rmp-serde", version = "1.3", optional = true }
|
rmp_serde_1_3 = { package = "rmp-serde", version = "1.3", optional = true }
|
||||||
doc-comment = "0.3.3"
|
doc-comment = "0.3.3"
|
||||||
|
log = "0.4.27"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
serde_json = "1.0.116"
|
serde_json = "1.0.116"
|
||||||
|
|||||||
@@ -17,3 +17,4 @@ proc-macro = true
|
|||||||
syn = { version = "2.0.60", features = ["full"] }
|
syn = { version = "2.0.60", features = ["full"] }
|
||||||
quote = "1.0.36"
|
quote = "1.0.36"
|
||||||
proc-macro2 = "1.0.81"
|
proc-macro2 = "1.0.81"
|
||||||
|
log = "0.4.27"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ mod method;
|
|||||||
|
|
||||||
use crate::method::{
|
use crate::method::{
|
||||||
generate_native_model_decode_body, generate_native_model_decode_upgrade_body,
|
generate_native_model_decode_body, generate_native_model_decode_upgrade_body,
|
||||||
generate_native_model_encode_body, generate_native_model_encode_downgrade_body,
|
generate_native_model_encode_body,
|
||||||
generate_native_model_id, generate_native_model_version,
|
generate_native_model_id, generate_native_model_version,
|
||||||
};
|
};
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
@@ -107,7 +107,8 @@ pub fn native_model(args: TokenStream, input: TokenStream) -> TokenStream {
|
|||||||
let native_model_version_fn = generate_native_model_version(&attrs);
|
let native_model_version_fn = generate_native_model_version(&attrs);
|
||||||
let native_model_encode_body_fn = generate_native_model_encode_body(&attrs);
|
let native_model_encode_body_fn = generate_native_model_encode_body(&attrs);
|
||||||
let native_model_decode_body_fn = generate_native_model_decode_body(&attrs);
|
let native_model_decode_body_fn = generate_native_model_decode_body(&attrs);
|
||||||
let native_model_decode_upgrade_body_fn = generate_native_model_decode_upgrade_body(&attrs);
|
let native_model_decode_upgrade_body_fn = generate_native_model_decode_upgrade_body(&attrs, struct_name);
|
||||||
|
|
||||||
|
|
||||||
let gen = quote! {
|
let gen = quote! {
|
||||||
#ast
|
#ast
|
||||||
|
|||||||
@@ -1,17 +1,21 @@
|
|||||||
use crate::ModelAttributes;
|
use crate::ModelAttributes;
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::TokenStream;
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
|
use syn::Ident;
|
||||||
|
|
||||||
pub(crate) fn generate_native_model_decode_upgrade_body(attrs: &ModelAttributes) -> TokenStream {
|
pub(crate) fn generate_native_model_decode_upgrade_body(attrs: &ModelAttributes, struct_name: &Ident) -> TokenStream {
|
||||||
let native_model_from = attrs.from.clone();
|
let native_model_from = attrs.from.clone();
|
||||||
let native_model_try_from = attrs.try_from.clone();
|
let native_model_try_from = attrs.try_from.clone();
|
||||||
|
|
||||||
let model_from_or_try_from = if let Some(from) = native_model_from {
|
let model_from_or_try_from = if let Some(from) = native_model_from {
|
||||||
quote! {
|
quote! {
|
||||||
|
log::info!("Upgrading database {} from version {} to version {}", #struct_name, #from::native_model_version(), Self::native_model_version());
|
||||||
|
|
||||||
#from::native_model_decode_upgrade_body(data, id, version).map(|a| a.into())
|
#from::native_model_decode_upgrade_body(data, id, version).map(|a| a.into())
|
||||||
}
|
}
|
||||||
} else if let Some((try_from, error_try_from)) = native_model_try_from {
|
} else if let Some((try_from, error_try_from)) = native_model_try_from {
|
||||||
quote! {
|
quote! {
|
||||||
|
log::info!("Attempting to upgrade database {} from version {} to version {}", #struct_name, #try_from::native_model_version(), Self::native_model_version());
|
||||||
let result = #try_from::native_model_decode_upgrade_body(data, id, version).map(|b| {
|
let result = #try_from::native_model_decode_upgrade_body(data, id, version).map(|b| {
|
||||||
b.try_into()
|
b.try_into()
|
||||||
.map_err(|e: #error_try_from| native_model::UpgradeError {
|
.map_err(|e: #error_try_from| native_model::UpgradeError {
|
||||||
@@ -29,7 +33,7 @@ pub(crate) fn generate_native_model_decode_upgrade_body(attrs: &ModelAttributes)
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let gen = quote! {
|
let gen = quote! {
|
||||||
fn native_model_decode_upgrade_body(data: Vec<u8>, id: u32, version: u32) -> native_model::Result<Self> {
|
fn native_model_decode_upgrade_body(data: Vec<u8>, id: u32, version: u32) -> native_model::Result<Self> {
|
||||||
if version == Self::native_model_version() {
|
if version == Self::native_model_version() {
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
use crate::ModelAttributes;
|
|
||||||
use proc_macro2::TokenStream;
|
|
||||||
use quote::quote;
|
|
||||||
|
|
||||||
pub(crate) fn generate_native_model_encode_downgrade_body(attrs: &ModelAttributes) -> TokenStream {
|
|
||||||
let native_model_from = attrs.from.clone();
|
|
||||||
let native_model_try_from = attrs.try_from.clone();
|
|
||||||
|
|
||||||
let model_from_or_try_from = if let Some(from) = native_model_from {
|
|
||||||
quote! {
|
|
||||||
#from::native_model_encode_downgrade_body(self.into(), version)
|
|
||||||
}
|
|
||||||
} else if let Some((try_from, error_try_from)) = native_model_try_from {
|
|
||||||
quote! {
|
|
||||||
let result = #try_from::native_model_encode_downgrade_body(
|
|
||||||
self.try_into()
|
|
||||||
.map_err(|e: #error_try_from| native_model::DowngradeError {
|
|
||||||
msg: format!("{}", e),
|
|
||||||
source: e.into(),
|
|
||||||
})?,
|
|
||||||
version,
|
|
||||||
)?;
|
|
||||||
Ok(result)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
quote! {
|
|
||||||
Err(native_model::Error::DowngradeNotSupported {
|
|
||||||
from: version,
|
|
||||||
to: Self::native_model_version(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let gen = quote! {
|
|
||||||
fn native_model_encode_downgrade_body(self, version: u32) -> native_model::Result<Vec<u8>> {
|
|
||||||
if version == Self::native_model_version() {
|
|
||||||
let result = self.native_model_encode_body()?;
|
|
||||||
Ok(result)
|
|
||||||
} else if version < Self::native_model_version() {
|
|
||||||
#model_from_or_try_from
|
|
||||||
} else {
|
|
||||||
Err(native_model::Error::DowngradeNotSupported {
|
|
||||||
from: version,
|
|
||||||
to: Self::native_model_version(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
gen
|
|
||||||
}
|
|
||||||
|
|
||||||
// #[error("Wrong type id expected: {}, actual: {}", expected, actual)]
|
|
||||||
// WrongTypeId { expected: u32, actual: u32 },
|
|
||||||
@@ -1,13 +1,11 @@
|
|||||||
mod decode_body;
|
mod decode_body;
|
||||||
mod decode_upgrade_body;
|
mod decode_upgrade_body;
|
||||||
mod encode_body;
|
mod encode_body;
|
||||||
mod encode_downgrade_body;
|
|
||||||
mod id;
|
mod id;
|
||||||
mod version;
|
mod version;
|
||||||
|
|
||||||
pub(crate) use decode_body::*;
|
pub(crate) use decode_body::*;
|
||||||
pub(crate) use decode_upgrade_body::*;
|
pub(crate) use decode_upgrade_body::*;
|
||||||
pub(crate) use encode_body::*;
|
pub(crate) use encode_body::*;
|
||||||
pub(crate) use encode_downgrade_body::*;
|
|
||||||
pub(crate) use id::*;
|
pub(crate) use id::*;
|
||||||
pub(crate) use version::*;
|
pub(crate) use version::*;
|
||||||
|
|||||||
Reference in New Issue
Block a user