Skip to content

Commit

Permalink
Merge pull request #123 from blackbeam/derive-newtype-into-value
Browse files Browse the repository at this point in the history
derive: Implemnt `From<Newtype> for Value` when serialize_with is given
  • Loading branch information
blackbeam authored Jan 17, 2024
2 parents 0c819ad + 30a0132 commit a7ef7f8
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ zstd = "0.13"

[dev-dependencies]
proptest = "1.0"
unic-langid = { version = "0.9.4" }

[build-dependencies]
bindgen = { version = "0", default-features = false, features = ["runtime"] }
Expand Down
7 changes: 7 additions & 0 deletions derive/src/from_value/structs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ impl ToTokens for NewTypeNoGenerics<'_> {
#path(x.0)
}
}

impl From<#container_name> for #crat::Value
{
fn from(x: #container_name) -> Self {
#path(x.0)
}
}
))
}
None => None,
Expand Down
50 changes: 48 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -653,8 +653,54 @@ fn from_value_is_integer() {

#[cfg(test)]
mod tests {
use crate::row::convert::FromRow;
use crate::{constants::ColumnType, packets::Column, row::new_row};
use crate::{
constants::ColumnType,
packets::Column,
row::{convert::FromRow, new_row},
value::{convert::from_value, Value},
FromValueError,
};
use unic_langid::LanguageIdentifier;

#[derive(FromValue)]
#[mysql(serialize_with = "from_langid", deserialize_with = "to_langid")]
struct LangId(LanguageIdentifier);

impl std::ops::Deref for LangId {
type Target = LanguageIdentifier;

fn deref(&self) -> &Self::Target {
&self.0
}
}

fn to_langid(v: Value) -> Result<LanguageIdentifier, FromValueError> {
match v {
Value::Bytes(ref b) => match LanguageIdentifier::from_bytes(b) {
Ok(ident) => Ok(ident),
Err(_) => Err(FromValueError(v)),
},
_ => Err(FromValueError(v)),
}
}

fn from_langid(land_id: LanguageIdentifier) -> Value {
Value::Bytes(land_id.to_string().into())
}

#[test]
fn newtype_with() {
let mut value = Value::Bytes(b"en-US".into());

let ident = from_value::<LangId>(value);

assert_eq!(ident.language.to_string().as_str(), "en");
assert_eq!(ident.to_string().as_str(), "en-US");

value = ident.into();

assert_eq!(value, Value::Bytes(b"en-US".into()));
}

#[test]
fn from_row_derive() {
Expand Down

0 comments on commit a7ef7f8

Please sign in to comment.