@ -4,7 +4,7 @@ use std::{
str ,
} ;
use anyhow ::{ anyhow , Context , Result } ;
use anyhow ::{ anyhow , Result } ;
use helix_core ::hashmap ;
use helix_loader ::merge_toml_values ;
use log ::warn ;
@ -209,16 +209,18 @@ pub struct Theme {
impl From < Value > for Theme {
fn from ( value : Value ) -> Self {
let values : Result < HashMap < String , Value > > =
toml ::from_str ( & value . to_string ( ) ) . context ( "Failed to load theme" ) ;
let ( styles , scopes , highlights ) = build_theme_values ( values ) ;
Self {
styles ,
scopes ,
highlights ,
.. Default ::default ( )
if let Value ::Table ( table ) = value {
let ( styles , scopes , highlights ) = build_theme_values ( table ) ;
Self {
styles ,
scopes ,
highlights ,
.. Default ::default ( )
}
} else {
warn ! ( "Expected theme TOML value to be a table, found {:?}" , value ) ;
Default ::default ( )
}
}
}
@ -228,9 +230,9 @@ impl<'de> Deserialize<'de> for Theme {
where
D : Deserializer < ' de > ,
{
let values = Hash Map::< String , Value > ::deserialize ( deserializer ) ? ;
let values = Map::< String , Value > ::deserialize ( deserializer ) ? ;
let ( styles , scopes , highlights ) = build_theme_values ( Ok ( values ) ) ;
let ( styles , scopes , highlights ) = build_theme_values ( values ) ;
Ok ( Self {
styles ,
@ -242,39 +244,37 @@ impl<'de> Deserialize<'de> for Theme {
}
fn build_theme_values (
values : Result < Hash Map< String , Value > > ,
mut values : Map< String , Value > ,
) -> ( HashMap < String , Style > , Vec < String > , Vec < Style > ) {
let mut styles = HashMap ::new ( ) ;
let mut scopes = Vec ::new ( ) ;
let mut highlights = Vec ::new ( ) ;
if let Ok ( mut colors ) = values {
// TODO: alert user of parsing failures in editor
let palette = colors
. remove ( "palette" )
. map ( | value | {
ThemePalette ::try_from ( value ) . unwrap_or_else ( | err | {
warn ! ( "{}" , err ) ;
ThemePalette ::default ( )
} )
} )
. unwrap_or_default ( ) ;
// remove inherits from value to prevent errors
let _ = colors . remove ( "inherits" ) ;
styles . reserve ( colors . len ( ) ) ;
scopes . reserve ( colors . len ( ) ) ;
highlights . reserve ( colors . len ( ) ) ;
for ( name , style_value ) in colors {
let mut style = Style ::default ( ) ;
if let Err ( err ) = palette . parse_style ( & mut style , style_value ) {
// TODO: alert user of parsing failures in editor
let palette = values
. remove ( "palette" )
. map ( | value | {
ThemePalette ::try_from ( value ) . unwrap_or_else ( | err | {
warn ! ( "{}" , err ) ;
}
// these are used both as UI and as highlights
styles . insert ( name . clone ( ) , style ) ;
scopes . push ( name ) ;
highlights . push ( style ) ;
ThemePalette ::default ( )
} )
} )
. unwrap_or_default ( ) ;
// remove inherits from value to prevent errors
let _ = values . remove ( "inherits" ) ;
styles . reserve ( values . len ( ) ) ;
scopes . reserve ( values . len ( ) ) ;
highlights . reserve ( values . len ( ) ) ;
for ( name , style_value ) in values {
let mut style = Style ::default ( ) ;
if let Err ( err ) = palette . parse_style ( & mut style , style_value ) {
warn ! ( "{}" , err ) ;
}
// these are used both as UI and as highlights
styles . insert ( name . clone ( ) , style ) ;
scopes . push ( name ) ;
highlights . push ( style ) ;
}
( styles , scopes , highlights )