@@ -653,8 +653,54 @@ fn from_value_is_integer() {
653653
654654#[ cfg( test) ]
655655mod 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