use libc::{c_char, c_uchar};
use translate::FromGlib;
use translate::ToGlib;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct Char(pub c_char);
impl Char {
pub fn new(c: char) -> Option<Char> {
if c as u32 > 255 {
None
} else {
Some(Char(c as c_char))
}
}
}
impl From<Char> for char {
fn from(c: Char) -> char {
c.0 as u8 as char
}
}
#[doc(hidden)]
impl FromGlib<c_char> for Char {
fn from_glib(value: c_char) -> Self {
Char(value)
}
}
#[doc(hidden)]
impl ToGlib for Char {
type GlibType = c_char;
fn to_glib(&self) -> c_char {
self.0
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub struct UChar(pub c_uchar);
impl UChar {
pub fn new(c: char) -> Option<UChar> {
if c as u32 > 255 {
None
} else {
Some(UChar(c as c_uchar))
}
}
}
impl From<UChar> for char {
fn from(c: UChar) -> char {
c.0 as char
}
}
#[doc(hidden)]
impl FromGlib<c_uchar> for UChar {
fn from_glib(value: c_uchar) -> Self {
UChar(value)
}
}
#[doc(hidden)]
impl ToGlib for UChar {
type GlibType = c_uchar;
fn to_glib(&self) -> c_uchar {
self.0
}
}
#[cfg(test)]
mod tests {
use super::*;
use translate::from_glib;
#[test]
fn converts_single_byte_chars() {
assert_eq!(Char::new(0 as char), Some(Char(0)));
assert_eq!(Char::new(255 as char), Some(Char(-1)));
assert_eq!(Char::new('ñ'), Some(Char(241 as u8 as i8)));
assert_eq!(UChar::new(0 as char), Some(UChar(0)));
assert_eq!(UChar::new(255 as char), Some(UChar(255)));
assert_eq!(UChar::new('ñ'), Some(UChar(241 as u8)));
}
#[test]
fn refuses_multibyte_chars() {
assert_eq!(Char::new('☔'), None); assert_eq!(UChar::new('☔'), None);
}
#[test]
fn into_i8() {
assert_eq!(Char::new('A').unwrap().to_glib(), 65i8);
}
#[test]
fn into_u8() {
assert_eq!(UChar::new('A').unwrap().to_glib(), 65u8);
}
#[test]
fn into_char() {
assert_eq!(char::from(Char(65i8)), 'A');
assert_eq!('ñ', UChar(241u8).into());
}
#[test]
fn convert_from_glib() {
assert_eq!(Char(65i8), from_glib(65i8));
assert_eq!(UChar(241u8), from_glib(241u8));
}
}