Rewrite CounterStyleOrNone::from_gecko_value to use fewer binding functions

This commit is contained in:
Xidorn Quan 2017-08-30 13:12:10 +10:00
parent 473934c989
commit 65c2047df2
6 changed files with 1442 additions and 1329 deletions

View file

@ -6,8 +6,9 @@
//! Different kind of helpers to interact with Gecko values.
use Atom;
use app_units::Au;
use counter_style::Symbol;
use counter_style::{Symbol, Symbols};
use cssparser::RGBA;
use gecko_bindings::structs::{CounterStylePtr, nsStyleCoord};
use gecko_bindings::structs::{StyleGridTrackBreadth, StyleShapeRadius};
@ -476,33 +477,35 @@ impl CounterStyleOrNone {
}
}
/// Convert Gecko CounterStylePtr to CounterStyleOrNone.
pub fn from_gecko_value(gecko_value: &CounterStylePtr) -> Self {
use counter_style::{Symbol, Symbols};
use gecko_bindings::bindings::Gecko_CounterStyle_GetName;
use gecko_bindings::bindings::Gecko_CounterStyle_GetSymbols;
use gecko_bindings::bindings::Gecko_CounterStyle_GetSystem;
use gecko_bindings::bindings::Gecko_CounterStyle_IsName;
use gecko_bindings::bindings::Gecko_CounterStyle_IsNone;
/// Convert Gecko CounterStylePtr to CounterStyleOrNone or String.
pub fn from_gecko_value(gecko_value: &CounterStylePtr) -> Either<Self, String> {
use gecko_bindings::bindings;
use values::CustomIdent;
use values::generics::SymbolsType;
if unsafe { Gecko_CounterStyle_IsNone(gecko_value) } {
CounterStyleOrNone::None
} else if unsafe { Gecko_CounterStyle_IsName(gecko_value) } {
ns_auto_string!(name);
unsafe { Gecko_CounterStyle_GetName(gecko_value, &mut *name) };
CounterStyleOrNone::Name(CustomIdent((&*name).into()))
let name = unsafe { bindings::Gecko_CounterStyle_GetName(gecko_value) };
if !name.is_null() {
let name = Atom::from(name);
if name == atom!("none") {
Either::First(CounterStyleOrNone::None)
} else {
Either::First(CounterStyleOrNone::Name(CustomIdent(name)))
}
} else {
let system = unsafe { Gecko_CounterStyle_GetSystem(gecko_value) };
let symbol_type = SymbolsType::from_gecko_keyword(system as u32);
let symbols = unsafe {
let ref gecko_symbols = *Gecko_CounterStyle_GetSymbols(gecko_value);
gecko_symbols.iter().map(|gecko_symbol| {
let anonymous = unsafe {
bindings::Gecko_CounterStyle_GetAnonymous(gecko_value).as_ref()
}.unwrap();
let symbols = &anonymous.mSymbols;
if anonymous.mSingleString {
debug_assert_eq!(symbols.len(), 1);
Either::Second(symbols[0].to_string())
} else {
let symbol_type = SymbolsType::from_gecko_keyword(anonymous.mSystem as u32);
let symbols = symbols.iter().map(|gecko_symbol| {
Symbol::String(gecko_symbol.to_string())
}).collect()
};
CounterStyleOrNone::Symbols(symbol_type, Symbols(symbols))
}).collect();
Either::First(CounterStyleOrNone::Symbols(symbol_type, Symbols(symbols)))
}
}
}
}