refactor(cosmic-config-derive): add support for types with generic parameters

This commit is contained in:
Ashley Wulber 2023-05-21 23:15:08 -04:00
parent b064293632
commit b82b6566f1
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820
4 changed files with 23 additions and 6 deletions

View file

@ -29,6 +29,7 @@ cosmic-panel-config = {git = "https://github.com/pop-os/cosmic-panel", optional
sctk = { package = "smithay-client-toolkit", git = "https://github.com/Smithay/client-toolkit", optional = true, rev = "389a4f2" } sctk = { package = "smithay-client-toolkit", git = "https://github.com/Smithay/client-toolkit", optional = true, rev = "389a4f2" }
slotmap = "1.0.6" slotmap = "1.0.6"
fraction = "0.13.0" fraction = "0.13.0"
cosmic-config = { path = "cosmic-config" }
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]
freedesktop-icons = "0.2.2" freedesktop-icons = "0.2.2"

View file

@ -1,6 +1,6 @@
use proc_macro::TokenStream; use proc_macro::TokenStream;
use quote::quote; use quote::quote;
use syn; use syn::{self, parse_quote};
#[proc_macro_derive(CosmicConfigEntry)] #[proc_macro_derive(CosmicConfigEntry)]
pub fn cosmic_config_entry_derive(input: TokenStream) -> TokenStream { pub fn cosmic_config_entry_derive(input: TokenStream) -> TokenStream {
@ -14,6 +14,7 @@ pub fn cosmic_config_entry_derive(input: TokenStream) -> TokenStream {
fn impl_cosmic_config_entry_macro(ast: &syn::DeriveInput) -> TokenStream { fn impl_cosmic_config_entry_macro(ast: &syn::DeriveInput) -> TokenStream {
let name = &ast.ident; let name = &ast.ident;
let generics = &ast.generics;
// Get the fields of the struct // Get the fields of the struct
let fields = match ast.data { let fields = match ast.data {
@ -42,8 +43,23 @@ fn impl_cosmic_config_entry_macro(ast: &syn::DeriveInput) -> TokenStream {
} }
}); });
// Get the existing where clause or create a new one if it doesn't exist
let mut where_clause = ast
.generics
.where_clause
.clone()
.unwrap_or_else(|| parse_quote!(where));
// Add your additional constraints to the where clause
// Here, we add the constraint 'T: Debug' to all generic parameters
for param in ast.generics.params.iter() {
where_clause
.predicates
.push(parse_quote!(#param: ::std::default::Default + ::serde::Serialize + ::serde::de::DeserializeOwned));
}
let gen = quote! { let gen = quote! {
impl CosmicConfigEntry for #name { impl #generics CosmicConfigEntry for #name #generics #where_clause {
fn write_entry(&self, config: &Config) -> Result<(), cosmic_config::Error> { fn write_entry(&self, config: &Config) -> Result<(), cosmic_config::Error> {
#(#write_each_config_field)* #(#write_each_config_field)*
Ok(()) Ok(())

View file

@ -6,7 +6,7 @@ edition = "2021"
[features] [features]
default = ["macro", "subscription"] default = ["macro", "subscription"]
macro = ["cosmic-config-derive"] macro = ["cosmic-config-derive"]
subscription = ["iced", "iced_futures"] subscription = ["iced_futures"]
[dependencies] [dependencies]
atomicwrites = "0.4.0" atomicwrites = "0.4.0"

View file

@ -1,7 +1,7 @@
#[cfg(feature = "subscription")] #[cfg(feature = "subscription")]
use iced::subscription;
#[cfg(feature = "subscription")]
use iced_futures::futures::channel::mpsc; use iced_futures::futures::channel::mpsc;
#[cfg(feature = "subscription")]
use iced_futures::subscription;
use notify::{RecommendedWatcher, Watcher}; use notify::{RecommendedWatcher, Watcher};
use serde::{de::DeserializeOwned, Serialize}; use serde::{de::DeserializeOwned, Serialize};
use std::{ use std::{
@ -277,7 +277,7 @@ pub enum ConfigUpdate<T> {
pub trait CosmicConfigEntry pub trait CosmicConfigEntry
where where
Self: Sized + Default, Self: Sized,
{ {
fn write_entry(&self, config: &Config) -> Result<(), crate::Error>; fn write_entry(&self, config: &Config) -> Result<(), crate::Error>;
fn get_entry(config: &Config) -> Result<Self, (Vec<crate::Error>, Self)>; fn get_entry(config: &Config) -> Result<Self, (Vec<crate::Error>, Self)>;