@@ -655,6 +655,71 @@ impl IntoLua for &Path {
655655 }
656656}
657657
658+ impl IntoLua for char {
659+ #[ inline]
660+ fn into_lua ( self , lua : & Lua ) -> Result < Value > {
661+ let mut char_bytes = [ 0 ; 4 ] ;
662+ self . encode_utf8 ( & mut char_bytes) ;
663+ Ok ( Value :: String ( lua. create_string ( char_bytes) ?) )
664+ }
665+ }
666+
667+ impl FromLua for char {
668+ #[ inline]
669+ fn from_lua ( value : Value , _lua : & Lua ) -> Result < Self > {
670+ let ty = value. type_name ( ) ;
671+ match value {
672+ // When integer: reduce it to u8 and try to convert to char
673+ Value :: Integer ( i) => {
674+ if i <= u8:: MAX . into ( ) {
675+ Ok ( char:: from ( i as u8 ) )
676+ } else {
677+ Err ( Error :: FromLuaConversionError {
678+ from : ty,
679+ to : Self :: type_name ( ) ,
680+ message : Some (
681+ "expected int to be a u8 when converting to char. You can also use strings."
682+ . to_string ( ) ,
683+ ) ,
684+ } )
685+ }
686+ }
687+ // When String: first char, and only if there is one char
688+ Value :: String ( s) => {
689+ let str = s. to_str ( ) ?;
690+ let mut str_iter = str. chars ( ) ;
691+ let Some ( char) = str_iter. next ( ) else {
692+ return Err ( Error :: FromLuaConversionError {
693+ from : ty,
694+ to : Self :: type_name ( ) ,
695+ message : Some (
696+ "string must have one char when converting to char. (empty string)" . to_string ( ) ,
697+ ) ,
698+ } )
699+ } ;
700+
701+ if let Some ( _extra_char) = str_iter. next ( ) {
702+ Err ( Error :: FromLuaConversionError {
703+ from : ty,
704+ to : Self :: type_name ( ) ,
705+ message : Some (
706+ "expected lua string to have exactly one char when converting to char"
707+ . to_string ( ) ,
708+ ) ,
709+ } )
710+ } else {
711+ Ok ( char)
712+ }
713+ }
714+ _ => Err ( Error :: FromLuaConversionError {
715+ from : ty,
716+ to : Self :: type_name ( ) ,
717+ message : Some ( "expected string or number" . to_string ( ) ) ,
718+ } ) ,
719+ }
720+ }
721+ }
722+
658723#[ inline]
659724unsafe fn push_bytes_into_stack < T > ( this : T , lua : & RawLua ) -> Result < ( ) >
660725where
0 commit comments