zellij_utils/plugin_api/
style.rs

1use super::generated_api::api::style::{
2    color::Payload as ProtobufColorPayload, Color as ProtobufColor, ColorType as ProtobufColorType,
3    Palette as ProtobufPalette, RgbColorPayload as ProtobufRgbColorPayload, Style as ProtobufStyle,
4    ThemeHue as ProtobufThemeHue,
5};
6use crate::data::{Palette, PaletteColor, Style, ThemeHue};
7use crate::errors::prelude::*;
8
9use std::convert::TryFrom;
10
11impl TryFrom<ProtobufStyle> for Style {
12    type Error = &'static str;
13    fn try_from(protobuf_style: ProtobufStyle) -> Result<Self, &'static str> {
14        Ok(Style {
15            colors: protobuf_style
16                .palette
17                .ok_or("malformed style payload")?
18                .try_into()?,
19            rounded_corners: protobuf_style.rounded_corners,
20            hide_session_name: protobuf_style.hide_session_name,
21        })
22    }
23}
24
25impl TryFrom<Style> for ProtobufStyle {
26    type Error = &'static str;
27    fn try_from(style: Style) -> Result<Self, &'static str> {
28        Ok(ProtobufStyle {
29            palette: Some(style.colors.try_into()?),
30            rounded_corners: style.rounded_corners,
31            hide_session_name: style.hide_session_name,
32        })
33    }
34}
35
36impl TryFrom<ProtobufPalette> for Palette {
37    type Error = &'static str;
38    fn try_from(protobuf_palette: ProtobufPalette) -> Result<Self, &'static str> {
39        Ok(Palette {
40            theme_hue: ProtobufThemeHue::from_i32(protobuf_palette.theme_hue)
41                .ok_or("malformed theme_hue payload for Palette")?
42                .try_into()?,
43            fg: protobuf_palette
44                .fg
45                .ok_or("malformed palette payload")?
46                .try_into()?,
47            bg: protobuf_palette
48                .bg
49                .ok_or("malformed palette payload")?
50                .try_into()?,
51            black: protobuf_palette
52                .black
53                .ok_or("malformed palette payload")?
54                .try_into()?,
55            red: protobuf_palette
56                .red
57                .ok_or("malformed palette payload")?
58                .try_into()?,
59            green: protobuf_palette
60                .green
61                .ok_or("malformed palette payload")?
62                .try_into()?,
63            yellow: protobuf_palette
64                .yellow
65                .ok_or("malformed palette payload")?
66                .try_into()?,
67            blue: protobuf_palette
68                .blue
69                .ok_or("malformed palette payload")?
70                .try_into()?,
71            magenta: protobuf_palette
72                .magenta
73                .ok_or("malformed palette payload")?
74                .try_into()?,
75            cyan: protobuf_palette
76                .cyan
77                .ok_or("malformed palette payload")?
78                .try_into()?,
79            white: protobuf_palette
80                .white
81                .ok_or("malformed palette payload")?
82                .try_into()?,
83            orange: protobuf_palette
84                .orange
85                .ok_or("malformed palette payload")?
86                .try_into()?,
87            gray: protobuf_palette
88                .gray
89                .ok_or("malformed palette payload")?
90                .try_into()?,
91            purple: protobuf_palette
92                .purple
93                .ok_or("malformed palette payload")?
94                .try_into()?,
95            gold: protobuf_palette
96                .gold
97                .ok_or("malformed palette payload")?
98                .try_into()?,
99            silver: protobuf_palette
100                .silver
101                .ok_or("malformed palette payload")?
102                .try_into()?,
103            pink: protobuf_palette
104                .pink
105                .ok_or("malformed palette payload")?
106                .try_into()?,
107            brown: protobuf_palette
108                .brown
109                .ok_or("malformed palette payload")?
110                .try_into()?,
111            ..Default::default()
112        })
113    }
114}
115
116impl TryFrom<Palette> for ProtobufPalette {
117    type Error = &'static str;
118    fn try_from(palette: Palette) -> Result<Self, &'static str> {
119        let theme_hue: ProtobufThemeHue = palette
120            .theme_hue
121            .try_into()
122            .map_err(|_| "malformed payload for palette")?;
123        Ok(ProtobufPalette {
124            theme_hue: theme_hue as i32,
125            fg: Some(palette.fg.try_into()?),
126            bg: Some(palette.bg.try_into()?),
127            black: Some(palette.black.try_into()?),
128            red: Some(palette.red.try_into()?),
129            green: Some(palette.green.try_into()?),
130            yellow: Some(palette.yellow.try_into()?),
131            blue: Some(palette.blue.try_into()?),
132            magenta: Some(palette.magenta.try_into()?),
133            cyan: Some(palette.cyan.try_into()?),
134            white: Some(palette.white.try_into()?),
135            orange: Some(palette.orange.try_into()?),
136            gray: Some(palette.gray.try_into()?),
137            purple: Some(palette.purple.try_into()?),
138            gold: Some(palette.gold.try_into()?),
139            silver: Some(palette.silver.try_into()?),
140            pink: Some(palette.pink.try_into()?),
141            brown: Some(palette.brown.try_into()?),
142            ..Default::default()
143        })
144    }
145}
146
147impl TryFrom<ProtobufColor> for PaletteColor {
148    type Error = &'static str;
149    fn try_from(protobuf_color: ProtobufColor) -> Result<Self, &'static str> {
150        match ProtobufColorType::from_i32(protobuf_color.color_type) {
151            Some(ProtobufColorType::Rgb) => match protobuf_color.payload {
152                Some(ProtobufColorPayload::RgbColorPayload(rgb_color_payload)) => {
153                    Ok(PaletteColor::Rgb((
154                        rgb_color_payload.red as u8,
155                        rgb_color_payload.green as u8,
156                        rgb_color_payload.blue as u8,
157                    )))
158                },
159                _ => Err("malformed payload for Rgb color"),
160            },
161            Some(ProtobufColorType::EightBit) => match protobuf_color.payload {
162                Some(ProtobufColorPayload::EightBitColorPayload(eight_bit_payload)) => {
163                    Ok(PaletteColor::EightBit(eight_bit_payload as u8))
164                },
165                _ => Err("malformed payload for 8bit color"),
166            },
167            None => Err("malformed payload for Color"),
168        }
169    }
170}
171
172impl TryFrom<PaletteColor> for ProtobufColor {
173    type Error = &'static str;
174    fn try_from(color: PaletteColor) -> Result<Self, &'static str> {
175        match color {
176            PaletteColor::Rgb((red, green, blue)) => {
177                let red = red as u32;
178                let green = green as u32;
179                let blue = blue as u32;
180                Ok(ProtobufColor {
181                    color_type: ProtobufColorType::Rgb as i32,
182                    payload: Some(ProtobufColorPayload::RgbColorPayload(
183                        ProtobufRgbColorPayload { red, green, blue },
184                    )),
185                })
186            },
187            PaletteColor::EightBit(color) => Ok(ProtobufColor {
188                color_type: ProtobufColorType::EightBit as i32,
189                payload: Some(ProtobufColorPayload::EightBitColorPayload(color as u32)),
190            }),
191        }
192    }
193}
194
195impl TryFrom<ThemeHue> for ProtobufThemeHue {
196    type Error = &'static str;
197    fn try_from(theme_hue: ThemeHue) -> Result<Self, &'static str> {
198        match theme_hue {
199            ThemeHue::Light => Ok(ProtobufThemeHue::Light),
200            ThemeHue::Dark => Ok(ProtobufThemeHue::Dark),
201        }
202    }
203}
204
205impl TryFrom<ProtobufThemeHue> for ThemeHue {
206    type Error = &'static str;
207    fn try_from(protobuf_theme_hue: ProtobufThemeHue) -> Result<Self, &'static str> {
208        match protobuf_theme_hue {
209            ProtobufThemeHue::Light => Ok(ThemeHue::Light),
210            ProtobufThemeHue::Dark => Ok(ThemeHue::Dark),
211        }
212    }
213}