commit 03014508ba67fdc3c56b97f88b601d5bfe15d9f0 Author: Linus Vogel Date: Sat Jul 25 11:24:22 2026 +0200 initial commmit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6936990 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +**/*.rs.bk +Cargo.lock diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/lfcm.iml b/.idea/lfcm.iml new file mode 100644 index 0000000..cf84ae4 --- /dev/null +++ b/.idea/lfcm.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..07d89d6 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8b435bb --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "lfcm" +version = "0.0.0" +authors = ["Linus Vogel "] +description = "A `cargo generate` template for quick-starting a procedural macro crate" +keywords = ["template", "proc_macro", "procmacro"] +edition = "2018" + +[lib] +proc-macro = true + +[dependencies] +quote = "1" +proc-macro2 = "1.0" +syn = "1.0" + diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..6fb6a01 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,157 @@ +# GNU LESSER GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates the +terms and conditions of version 3 of the GNU General Public License, +supplemented by the additional permissions listed below. + +## 0. Additional Definitions. + +As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the +GNU General Public License. + +"The Library" refers to a covered work governed by this License, other +than an Application or a Combined Work as defined below. + +An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + +A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + +The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + +The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +## 1. Exception to Section 3 of the GNU GPL. + +You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +## 2. Conveying Modified Versions. + +If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + +- a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or +- b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +## 3. Object Code Incorporating Material from Library Header Files. + +The object code form of an Application may incorporate material from a +header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + +- a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the object code with a copy of the GNU GPL and this + license document. + +## 4. Combined Works. + +You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + +- a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. +- b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. +- c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. +- d) Do one of the following: + - 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + - 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. +- e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +## 5. Combined Libraries. + +You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + +- a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. +- b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + +## 6. Revised Versions of the GNU Lesser General Public License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License "or any later version" applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, you +may choose any version of the GNU Lesser General Public License ever +published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8db83db --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# LFCM (Linus' Fancy Config Module) + +LFCM is a procedural macro crate designed to simplify configuration management in Rust. + +With LFCM, you only need to provide a single definition of your configuration structure. The crate then automatically generates a fully functional struct that implements the necessary deserialization logic, allowing you to load configuration files with minimal boilerplate. + +## Features + +- **Minimal Boilerplate**: Define your config structure once and let the macro handle the rest. +- **Automatic Deserialization**: Automatically implements the deserialization process for your structs. +- **Seamless Integration**: Generated structure are rust-native structs and allow for strong typesafety and autocompletion. + +## Usage + +```rust +use lfcm::config; + +config!{ + name = Config; + +} + +fn main() { + // Load configuration from a file (e.g., config.toml or config.json) + let + + println!("API Key: {}", config.api_key); + println!("Port: {}", config.port); + println!("Debug Mode: {}", config.debug_mode); +} +``` + +## Installation +Add lfcm to your Cargo.toml: +```toml +[dependencies] +lfcm = "" +``` + +## License +LGPL-3.0 + +## Disclaimer +This is currently a hobby project of mine. This has materialised out of the frustration +of having to interact with either 'hard-to-use' or 'no-typesafe-and-no-autocomplete' configuration +setups and depending on this frustration I will continue working on this library or not. diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..c99da4d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,59 @@ +extern crate proc_macro; +use proc_macro::TokenStream; + + +use quote::quote; +use syn::parse::{Parse, ParseStream}; +use syn::{parse_macro_input}; + +struct ParseConfigDeclaration { + +} + +impl Parse for ParseConfigDeclaration { + fn parse(input: ParseStream) -> syn::Result { + todo!() + } +} + +#[proc_macro] +pub fn my_macro(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as ParseConfigDeclaration); + + let tokens = quote! { + #input + + struct Hello; + }; + + tokens.into() +} + +/// Example of user-defined [derive mode macro][1] +/// +/// [1]: https://doc.rust-lang.org/reference/procedural-macros.html#derive-mode-macros +#[proc_macro_derive(MyDerive)] +pub fn my_derive(_input: TokenStream) -> TokenStream { + + let tokens = quote! { + struct Hello; + }; + + tokens.into() +} + +/// Example of user-defined [procedural macro attribute][1]. +/// +/// [1]: https://doc.rust-lang.org/reference/procedural-macros.html#attribute-macros +#[proc_macro_attribute] +pub fn my_attribute(_args: TokenStream, input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + + let tokens = quote! { + #input + + struct Hello; + }; + + tokens.into() +}