refactor(cosmic-config-derive): add support for types with generic parameters
This commit is contained in:
parent
b064293632
commit
b82b6566f1
4 changed files with 23 additions and 6 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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(())
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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)>;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue