Skip to content

Commit

Permalink
refactor: rewrite ConfigProperty macro and clean config crate code (#68)
Browse files Browse the repository at this point in the history
* refactor: make the `AttributeInfo` as generic structure for DRY

* refactor: rewrite ConfigProperty and clean GenericBuilder macros

* test: update tests for ConfigProperty macro and rename test files

* docs: update documentation for refactored ConfigProperty macro

* fix: do not attach old attributes to new struct

* refactor: update config code according to updated ConfigProprety macro

* refactor: apply cargo fmt and clippy suggestions
  • Loading branch information
JarKz authored Dec 16, 2024
1 parent 591b833 commit bb17671
Show file tree
Hide file tree
Showing 11 changed files with 697 additions and 582 deletions.
113 changes: 53 additions & 60 deletions crates/config/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,34 +12,41 @@ use crate::{
};

public! {
#[derive(ConfigProperty, Debug, Deserialize, Default, Clone)]
#[cfg_prop(name(DisplayConfig), derive(Debug))]
struct TomlDisplayConfig {
layout: Option<Layout>,
#[derive(ConfigProperty, Debug)]
#[cfg_prop(name(TomlDisplayConfig), derive(Debug, Deserialize, Default, Clone))]
struct DisplayConfig {
layout: Layout,

theme: Option<String>,
theme: String,

#[cfg_prop(use_type(ImageProperty), mergeable)]
image: Option<TomlImageProperty>,
#[cfg_prop(use_type(TomlImageProperty), mergeable)]
image: ImageProperty,

padding: Option<Spacing>,
#[cfg_prop(use_type(Border), mergeable)]
border: Option<TomlBorder>,
padding: Spacing,

#[cfg_prop(temporary, mergeable)]
text: Option<TomlTextProperty>,
#[cfg_prop(use_type(TomlBorder), mergeable)]
border: Border,

#[cfg_prop(inherits(field = text), use_type(TextProperty), default(TomlTextProperty::default_title()), mergeable)]
title: Option<TomlTextProperty>,
#[cfg_prop(
also_from(name = text, mergeable),
use_type(TomlTextProperty),
default(TomlTextProperty::default_title()),
mergeable
)]
title: TextProperty,

#[cfg_prop(inherits(field = text), use_type(TextProperty), mergeable)]
body: Option<TomlTextProperty>,
#[cfg_prop(
also_from(name = text, mergeable),
use_type(TomlTextProperty),
mergeable
)]
body: TextProperty,

#[cfg_prop(default(true))]
markup: Option<bool>,
markup: bool,

#[cfg_prop(default(Timeout::new(0)))]
timeout: Option<Timeout>,
timeout: Timeout,
}
}

Expand Down Expand Up @@ -76,30 +83,23 @@ impl From<String> for Layout {
}

public! {
#[derive(ConfigProperty, Debug, Deserialize, Default, Clone)]
#[cfg_prop(
name(ImageProperty),
derive(GenericBuilder, Debug, Clone),
attributes(#[gbuilder(name(GBuilderImageProperty))])
)]
struct TomlImageProperty {
#[cfg_prop(
default(64),
attributes(#[gbuilder(default(64))])
)]
max_size: Option<u16>,

#[cfg_prop(
default(0),
attributes(#[gbuilder(default(0))])
)]
rounding: Option<u16>,

#[cfg_prop(attributes(#[gbuilder(default)]))]
margin: Option<Spacing>,

#[cfg_prop(attributes(#[gbuilder(default)]))]
resizing_method: Option<ResizingMethod>,
#[derive(ConfigProperty, GenericBuilder, Debug, Clone)]
#[cfg_prop(name(TomlImageProperty), derive(Debug, Clone, Default, Deserialize))]
#[gbuilder(name(GBuilderImageProperty))]
struct ImageProperty {
#[cfg_prop(default(64))]
#[gbuilder(default(64))]
max_size: u16,

#[cfg_prop(default(0))]
#[gbuilder(default(0))]
rounding: u16,

#[gbuilder(default)]
margin: Spacing,

#[gbuilder(default)]
resizing_method: ResizingMethod,
}
}

Expand Down Expand Up @@ -158,24 +158,17 @@ impl TryFrom<shared::value::Value> for ResizingMethod {
}

public! {
#[derive(ConfigProperty, Debug, Deserialize, Default, Clone)]
#[cfg_prop(
name(Border),
derive(GenericBuilder, Debug, Clone, Default),
attributes(#[gbuilder(name(GBuilderBorder))])
)]
struct TomlBorder {
#[cfg_prop(
default(0),
attributes(#[gbuilder(default(0))])
)]
size: Option<u8>,

#[cfg_prop(
default(0),
attributes(#[gbuilder(default(0))])
)]
radius: Option<u8>,
#[derive(ConfigProperty, GenericBuilder, Debug, Default, Clone)]
#[cfg_prop(name(TomlBorder), derive(Debug, Clone, Default, Deserialize))]
#[gbuilder(name(GBuilderBorder))]
struct Border {
#[cfg_prop(default(0))]
#[gbuilder(default(0))]
size: u8,

#[cfg_prop(default(0))]
#[gbuilder(default(0))]
radius: u8,
}
}

Expand Down
22 changes: 11 additions & 11 deletions crates/config/src/general.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,25 @@ use serde::Deserialize;
use crate::{public, sorting::Sorting};

public! {
#[derive(ConfigProperty, Default, Debug, Deserialize, Clone)]
#[cfg_prop(name(GeneralConfig), derive(Debug))]
struct TomlGeneralConfig {
font: Option<Font>,
#[derive(ConfigProperty, Debug)]
#[cfg_prop(name(TomlGeneralConfig), derive(Debug, Default, Deserialize, Clone))]
struct GeneralConfig {
font: Font,

#[cfg_prop(default(300))]
width: Option<u16>,
width: u16,
#[cfg_prop(default(150))]
height: Option<u16>,
height: u16,

anchor: Option<Anchor>,
offset: Option<(u8, u8)>,
anchor: Anchor,
offset: (u8, u8),
#[cfg_prop(default(10))]
gap: Option<u8>,
gap: u8,

sorting: Option<Sorting>,
sorting: Sorting,

#[cfg_prop(default(0))]
limit: Option<u8>,
limit: u8,
}
}

Expand Down
53 changes: 23 additions & 30 deletions crates/config/src/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,32 @@ use shared::value::TryDowncast;
use super::{public, Spacing};

public! {
#[derive(ConfigProperty, Debug, Deserialize, Default, Clone)]
#[cfg_prop(
name(TextProperty),
derive(GenericBuilder, Debug, Clone),
attributes(#[gbuilder(name(GBuilderTextProperty))])
)]
struct TomlTextProperty {
#[cfg_prop(
default(true),
attributes(#[gbuilder(default(true))])
)]
wrap: Option<bool>,

#[cfg_prop(attributes(#[gbuilder(default)]))]
ellipsize_at: Option<EllipsizeAt>,

#[cfg_prop(attributes(#[gbuilder(default)]))]
style: Option<TextStyle>,

#[cfg_prop(attributes(#[gbuilder(default)]))]
margin: Option<Spacing>,

#[cfg_prop(attributes(#[gbuilder(default)]))]
justification: Option<TextJustification>,
#[derive(ConfigProperty, GenericBuilder, Debug, Clone)]
#[cfg_prop(name(TomlTextProperty),derive(Debug, Clone, Default, Deserialize))]
#[gbuilder(name(GBuilderTextProperty))]
struct TextProperty {
#[cfg_prop(default(true))]
#[gbuilder(default(true))]
wrap: bool,

#[gbuilder(default)]
ellipsize_at: EllipsizeAt,

#[gbuilder(default)]
style: TextStyle,

#[gbuilder(default)]
margin: Spacing,

#[gbuilder(default)]
justification: TextJustification,

#[cfg_prop(default(12))]
font_size: Option<u8>,
font_size: u8,

#[cfg_prop(
default(0),
attributes(#[gbuilder(default(0))])
)]
line_spacing: Option<u8>,
#[cfg_prop(default(0))]
#[gbuilder(default(0))]
line_spacing: u8,
}
}

Expand Down
32 changes: 16 additions & 16 deletions crates/config/src/theme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ use serde::Deserialize;
use crate::{color::Color, public};

public! {
#[derive(ConfigProperty, Deserialize, Default, Debug)]
#[cfg_prop(name(Theme), derive(Debug))]
struct TomlTheme {
name: Option<String>,
#[derive(ConfigProperty, Debug)]
#[cfg_prop(name(TomlTheme), derive(Debug, Deserialize, Default))]
struct Theme {
name: String,

#[cfg_prop(use_type(Colors))]
low: Option<TomlColors>,
#[cfg_prop(use_type(TomlColors))]
low: Colors,

#[cfg_prop(use_type(Colors))]
normal: Option<TomlColors>,
#[cfg_prop(use_type(TomlColors))]
normal: Colors,

#[cfg_prop(use_type(Colors), default(path = TomlColors::default_critical))]
critical: Option<TomlColors>,
#[cfg_prop(use_type(TomlColors), default(path = TomlColors::default_critical))]
critical: Colors,
}
}

Expand All @@ -38,16 +38,16 @@ impl Default for Theme {
}

public! {
#[derive(ConfigProperty, Clone, Default, Deserialize, Debug)]
#[cfg_prop(name(Colors), derive(Debug))]
struct TomlColors {
#[derive(ConfigProperty, Debug)]
#[cfg_prop(name(TomlColors), derive(Debug, Clone, Deserialize, Default))]
struct Colors {
#[cfg_prop(default(path = Color::new_black))]
foreground: Option<Color>,
foreground: Color,
#[cfg_prop(default(path = Color::new_white))]
background: Option<Color>,
background: Color,

#[cfg_prop(default(path = Color::new_black))]
border: Option<Color>,
border: Color,
}
}

Expand Down
Loading

0 comments on commit bb17671

Please sign in to comment.