Canop / termimad

A library to display rich (Markdown) snippets and texts in a rust terminal application
MIT License
903 stars 31 forks source link

Trait implementations for serialization #19

Closed samtay closed 10 months ago

samtay commented 4 years ago

I'd like to have my MadSkin come from a user-supplied theme, like colors.yml. I don't mind just making a newtype around MadSkin to do so, but I noticed the code in broot that handles parsing some user-friendlier keywords, etc., and just wanted to check if you plan on moving that back out to minimad or termimad.

I also thought, to minimize effort, perhaps you'd be interested in just adding a package flag serialization which if set, would add serde dependency and provide serialize/deserialize traits. (To avoid users having to deal with orphan problems when they want to have theme configuration.)

Just opening this issue for your awareness; if you don't feel that serialization should be a part of the library, feel free to close it! Thanks.

Canop commented 4 years ago

This is a good question.

While I considered having a library or feature for the (de)serialization of a whole madskin, which is a quite complex problem in reality as you typically want to deal with several of them and you also want to deal with your hadcoded ones (hence the StyleMap! macro in broot), I didn't think about making it easier to deal with your own madskin-like types by first offering (de)serialization at the compund_style level.

It should be noted that termimad's CompoundStyle is nothing more than a Crossterm ContentStyle. Rather than putting this (de)serialization utility in termimad, it could be offered in an independant library which would be available to crossterm users without forcing them to use termimad. I don't know how many users would be interested but the initial effort seems quite low (pinging Timon).

Canop commented 4 years ago

Reading this again, I think I should just add the "serde" feature and derive (de)serialize when the feature is active. Not so easy, crossterm's StyledContent<char> doesn't derive Serialize and Deserialize so there's more work to do.

sevenuz commented 11 months ago

Hallo, I am also interested in a serialized form of the skin. Why is it possible to deserialize it, as it is done in your example skin-file, but not possible to derive serialize? Sorry I am quite new to Rust and not sure, if this question makes sense :D

Canop commented 11 months ago

@sevenuz Yes, your question makes sense.

On the surface, the reason you can't just derive Serialize is that you need the inner properties to implement Serialize too.

But it doesn't mean I can't implement Serialize, it's just that I didn't initially see the need and then I forgot this issue. I'm putting it in my TODO list now.

sevenuz commented 11 months ago

Okey, that sounds promising. As a workaround I will use the a default skin to serialize, then the user can edit manually and I can deserialize as it is done in your example, so this has no priority :D