Skip to content

Commit a7ef7f8

Browse files
authored
Merge pull request #123 from blackbeam/derive-newtype-into-value
derive: Implemnt `From<Newtype> for Value` when serialize_with is given
2 parents 0c819ad + 30a0132 commit a7ef7f8

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ zstd = "0.13"
7474

7575
[dev-dependencies]
7676
proptest = "1.0"
77+
unic-langid = { version = "0.9.4" }
7778

7879
[build-dependencies]
7980
bindgen = { version = "0", default-features = false, features = ["runtime"] }

derive/src/from_value/structs/mod.rs

+7
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,13 @@ impl ToTokens for NewTypeNoGenerics<'_> {
106106
#path(x.0)
107107
}
108108
}
109+
110+
impl From<#container_name> for #crat::Value
111+
{
112+
fn from(x: #container_name) -> Self {
113+
#path(x.0)
114+
}
115+
}
109116
))
110117
}
111118
None => None,

src/lib.rs

+48-2
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,54 @@ fn from_value_is_integer() {
653653

654654
#[cfg(test)]
655655
mod tests {
656-
use crate::row::convert::FromRow;
657-
use crate::{constants::ColumnType, packets::Column, row::new_row};
656+
use crate::{
657+
constants::ColumnType,
658+
packets::Column,
659+
row::{convert::FromRow, new_row},
660+
value::{convert::from_value, Value},
661+
FromValueError,
662+
};
663+
use unic_langid::LanguageIdentifier;
664+
665+
#[derive(FromValue)]
666+
#[mysql(serialize_with = "from_langid", deserialize_with = "to_langid")]
667+
struct LangId(LanguageIdentifier);
668+
669+
impl std::ops::Deref for LangId {
670+
type Target = LanguageIdentifier;
671+
672+
fn deref(&self) -> &Self::Target {
673+
&self.0
674+
}
675+
}
676+
677+
fn to_langid(v: Value) -> Result<LanguageIdentifier, FromValueError> {
678+
match v {
679+
Value::Bytes(ref b) => match LanguageIdentifier::from_bytes(b) {
680+
Ok(ident) => Ok(ident),
681+
Err(_) => Err(FromValueError(v)),
682+
},
683+
_ => Err(FromValueError(v)),
684+
}
685+
}
686+
687+
fn from_langid(land_id: LanguageIdentifier) -> Value {
688+
Value::Bytes(land_id.to_string().into())
689+
}
690+
691+
#[test]
692+
fn newtype_with() {
693+
let mut value = Value::Bytes(b"en-US".into());
694+
695+
let ident = from_value::<LangId>(value);
696+
697+
assert_eq!(ident.language.to_string().as_str(), "en");
698+
assert_eq!(ident.to_string().as_str(), "en-US");
699+
700+
value = ident.into();
701+
702+
assert_eq!(value, Value::Bytes(b"en-US".into()));
703+
}
658704

659705
#[test]
660706
fn from_row_derive() {

0 commit comments

Comments
 (0)