@@ -102,12 +102,13 @@ impl<'de> Deserialize<'de> for Theme {
103 let mut styles = HashMap::new();
103 let mut styles = HashMap::new();
105− if let Ok(colors) = HashMap::<String, Value>::deserialize(deserializer) {
105+ if let Ok(mut colors) = HashMap::<String, Value>::deserialize(deserializer) {
106+ let palette = parse_palette(colors.remove("palette"));
106 // scopes.reserve(colors.len());
107 // scopes.reserve(colors.len());
107 styles.reserve(colors.len());
108 styles.reserve(colors.len());
108 for (name, style_value) in colors {
109 for (name, style_value) in colors {
109 let mut style = Style::default();
110 let mut style = Style::default();
110− parse_style(&mut style, style_value);
111+ parse_style(&mut style, style_value, &palette);
111 // scopes.push(name);
112 // scopes.push(name);
112 styles.insert(name, style);
113 styles.insert(name, style);
@@ -118,18 +119,31 @@ impl<'de> Deserialize<'de> for Theme {
122+fn parse_palette(value: Option<Value>) -> HashMap<String, Color> {
124+ Some(Value::Table(entries)) => entries,
125+ _ => return HashMap::default(),
128+ .filter_map(|(name, value)| {
129+ let color = parse_color(value, &HashMap::default())?;
121−fn parse_style(style: &mut Style, value: Value) {
135+fn parse_style(style: &mut Style, value: Value, palette: &HashMap<String, Color>) {
122 //TODO: alert user of parsing failures
136 //TODO: alert user of parsing failures
123 if let Value::Table(entries) = value {
137 if let Value::Table(entries) = value {
124 for (name, value) in entries {
138 for (name, value) in entries {
125 match name.as_str() {
139 match name.as_str() {
126 "fg" => {
140 "fg" => {
127− if let Some(color) = parse_color(value) {
141+ if let Some(color) = parse_color(value, palette) {
128 *style = style.fg(color);
142 *style = style.fg(color);
131 "bg" => {
145 "bg" => {
132− if let Some(color) = parse_color(value) {
146+ if let Some(color) = parse_color(value, palette) {
133 *style = style.bg(color);
147 *style = style.bg(color);
@@ -143,7 +157,7 @@ fn parse_style(style: &mut Style, value: Value) {
146− } else if let Some(color) = parse_color(value) {
160+ } else if let Some(color) = parse_color(value, palette) {
147 *style = style.fg(color);
161 *style = style.fg(color);
@@ -164,9 +178,11 @@ fn hex_string_to_rgb(s: &str) -> Option<(u8, u8, u8)> {
167−fn parse_color(value: Value) -> Option<Color> {
181+fn parse_color(value: Value, palette: &HashMap<String, Color>) -> Option<Color> {
168 if let Value::String(s) = value {
182 if let Value::String(s) = value {
183+ if let Some(color) = palette.get(&s) {
169− if let Some((red, green, blue)) = hex_string_to_rgb(&s) {
185+ } else if let Some((red, green, blue)) = hex_string_to_rgb(&s) {
170 Some(Color::Rgb(red, green, blue))
186 Some(Color::Rgb(red, green, blue))
172 warn!("malformed hexcode in theme: {}", s);
188 warn!("malformed hexcode in theme: {}", s);
@@ -226,7 +242,23 @@ fn test_parse_style_string() {
226 let fg = Value::String("#ffffff".to_string());
242 let fg = Value::String("#ffffff".to_string());
228 let mut style = Style::default();
244 let mut style = Style::default();
229− parse_style(&mut style, fg);
245+ parse_style(&mut style, fg, &HashMap::default());
247+ assert_eq!(style, Style::default().fg(Color::Rgb(255, 255, 255)));
252+ let fg = Value::String("my_color".to_string());
254+ let mut style = Style::default();
258+ &vec![("my_color".to_string(), Color::Rgb(255, 255, 255))]
231 assert_eq!(style, Style::default().fg(Color::Rgb(255, 255, 255)));
263 assert_eq!(style, Style::default().fg(Color::Rgb(255, 255, 255)));
@@ -244,7 +276,7 @@ fn test_parse_style_table() {
244 let mut style = Style::default();
276 let mut style = Style::default();
245 if let Value::Table(entries) = table {
277 if let Value::Table(entries) = table {
246 for (_name, value) in entries {
278 for (_name, value) in entries {
247− parse_style(&mut style, value);
279+ parse_style(&mut style, value, &HashMap::default());