mirror of
https://github.com/kristoferssolo/filecaster.git
synced 2025-10-21 19:00:34 +00:00
docs: add lib docs
This commit is contained in:
parent
cd8fd27e69
commit
748db052ff
64
.github/workflows/ci.yml
vendored
64
.github/workflows/ci.yml
vendored
@ -9,7 +9,7 @@ env:
|
|||||||
RUSTFLAGS: --deny warnings
|
RUSTFLAGS: --deny warnings
|
||||||
RUSTDOCFLAGS: --deny warnings
|
RUSTDOCFLAGS: --deny warnings
|
||||||
jobs:
|
jobs:
|
||||||
# Run tests.
|
# Run tests
|
||||||
test:
|
test:
|
||||||
name: Tests
|
name: Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -20,17 +20,29 @@ jobs:
|
|||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install --no-install-recommends \
|
||||||
|
libasound2-dev libudev-dev libwayland-dev \
|
||||||
|
libxkbcommon-dev
|
||||||
- name: Populate target directory from cache
|
- name: Populate target directory from cache
|
||||||
uses: Leafwing-Studios/cargo-cache@v2
|
uses: Leafwing-Studios/cargo-cache@v2
|
||||||
with:
|
with:
|
||||||
sweep-cache: true
|
sweep-cache: true
|
||||||
- name: Run tests
|
- name: Install cargo-nextest
|
||||||
|
run: cargo install cargo-nextest --locked
|
||||||
|
- name: Run tests with nextest
|
||||||
run: |
|
run: |
|
||||||
cargo test --locked --workspace --all-features --all-targets
|
cargo nextest run \
|
||||||
|
--all-features \
|
||||||
|
--all-targets
|
||||||
# Workaround for https://github.com/rust-lang/cargo/issues/6669
|
# Workaround for https://github.com/rust-lang/cargo/issues/6669
|
||||||
cargo test --locked --workspace --all-features --doc
|
cargo test \
|
||||||
# Run clippy lints.
|
--locked \
|
||||||
|
--workspace \
|
||||||
|
--all-features \
|
||||||
|
--doc
|
||||||
|
# Run clippy lints
|
||||||
clippy:
|
clippy:
|
||||||
name: Clippy
|
name: Clippy
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -43,14 +55,24 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
components: clippy
|
components: clippy
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install --no-install-recommends \
|
||||||
|
libasound2-dev libudev-dev libwayland-dev \
|
||||||
|
libxkbcommon-dev
|
||||||
- name: Populate target directory from cache
|
- name: Populate target directory from cache
|
||||||
uses: Leafwing-Studios/cargo-cache@v2
|
uses: Leafwing-Studios/cargo-cache@v2
|
||||||
with:
|
with:
|
||||||
sweep-cache: true
|
sweep-cache: true
|
||||||
- name: Run clippy lints
|
- name: Run clippy lints
|
||||||
run: cargo clippy --locked --workspace --all-features -- --deny warnings
|
run: |
|
||||||
# Check formatting.
|
cargo clippy \
|
||||||
|
--locked \
|
||||||
|
--workspace \
|
||||||
|
--all-features \
|
||||||
|
-- \
|
||||||
|
--deny warnings
|
||||||
|
# Check formatting
|
||||||
format:
|
format:
|
||||||
name: Format
|
name: Format
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -63,8 +85,12 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
components: rustfmt
|
components: rustfmt
|
||||||
- name: Run cargo fmt
|
- name: Run cargo fmt
|
||||||
run: cargo fmt --all -- --check
|
run: |
|
||||||
# Check documentation.
|
cargo fmt \
|
||||||
|
--all \
|
||||||
|
-- \
|
||||||
|
--check
|
||||||
|
# Check documentation
|
||||||
doc:
|
doc:
|
||||||
name: Docs
|
name: Docs
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -75,10 +101,22 @@ jobs:
|
|||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: sudo apt-get update; sudo apt-get install --no-install-recommends libasound2-dev libudev-dev libwayland-dev libxkbcommon-dev
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install --no-install-recommends \
|
||||||
|
libasound2-dev libudev-dev libwayland-dev \
|
||||||
|
libxkbcommon-dev
|
||||||
- name: Populate target directory from cache
|
- name: Populate target directory from cache
|
||||||
uses: Leafwing-Studios/cargo-cache@v2
|
uses: Leafwing-Studios/cargo-cache@v2
|
||||||
with:
|
with:
|
||||||
sweep-cache: true
|
sweep-cache: true
|
||||||
- name: Check documentation
|
- name: Check documentation
|
||||||
run: cargo doc --locked --workspace --all-features --document-private-items --no-deps
|
run: |
|
||||||
|
cargo doc \
|
||||||
|
--locked \
|
||||||
|
--workspace \
|
||||||
|
--all \
|
||||||
|
--features \
|
||||||
|
--document-private \
|
||||||
|
--items \
|
||||||
|
--no-deps
|
||||||
|
|||||||
77
src/lib.rs
77
src/lib.rs
@ -1,3 +1,76 @@
|
|||||||
|
//! # filecaster
|
||||||
|
//!
|
||||||
|
//! `filecaster` is a small `proc-macro` crate that provides a derive‐macro
|
||||||
|
//! `#[derive(FromFile)]` to make it trivial to load partial configurations
|
||||||
|
//! from files, merge them with defaults, and get a fully‐populated struct.
|
||||||
|
//!
|
||||||
|
//! ## What it does
|
||||||
|
//!
|
||||||
|
//! For any struct with named fields, `#[derive(FromFile)]` generates:
|
||||||
|
//!
|
||||||
|
//! 1. A companion `<YourStruct>NameFile` struct in which each field is wrapped
|
||||||
|
//! in `Option<...>`.
|
||||||
|
//! 2. A constructor `YourStruct::from_file(file: Option<YourStructFile>) -> YourStruct`
|
||||||
|
//! that takes your partially‐filled file struct, fills in `None` fields
|
||||||
|
//! with either:
|
||||||
|
//! - an expression you supply via `#[from_file(default = ...)]`, or
|
||||||
|
//! - `Default::default()` (requires `T: Default`)
|
||||||
|
//! 3. An implementation of `From<Option<YourStructFile>> for YourStruct`.
|
||||||
|
//!
|
||||||
|
//! Because each field in the file‐struct is optional, you can deserialize
|
||||||
|
//! e.g. JSON, YAML or TOML into it via Serde, then call `.from_file(...)`
|
||||||
|
//! to get your final struct.
|
||||||
|
//!
|
||||||
|
//! ## Optional per‐field defaults
|
||||||
|
//!
|
||||||
|
//! Use a `#[from_file(default = <expr>)]` attribute on any field to override
|
||||||
|
//! the fallback value. You may supply any expression valid in that struct’s
|
||||||
|
//! context. If you omit it, the macro will require `T: Default` and call
|
||||||
|
//! `unwrap_or_default()`.
|
||||||
|
//!
|
||||||
|
//! Example:
|
||||||
|
//!
|
||||||
|
//! ```rust
|
||||||
|
//! use from_file::FromFile;
|
||||||
|
//!
|
||||||
|
//! #[derive(Debug, Clone, FromFile)]
|
||||||
|
//! #[serde(default)]
|
||||||
|
//! struct AppConfig {
|
||||||
|
//! /// If the user does not specify a host, use `"127.0.0.1"`.
|
||||||
|
//! #[from_file(default = "127.0.0.1")]
|
||||||
|
//! host: String,
|
||||||
|
//!
|
||||||
|
//! /// Number of worker threads; defaults to `4`.
|
||||||
|
//! #[from_file(default = 4)]
|
||||||
|
//! workers: usize,
|
||||||
|
//!
|
||||||
|
//! /// If not set, use `false`.
|
||||||
|
//! auto_reload: bool, // requires `bool: Default`
|
||||||
|
//! }
|
||||||
|
//!
|
||||||
|
//! // After deserializing the partial config from disk (e.g. with Serde):
|
||||||
|
//! let file: Option<AppConfigFile> = serde_yaml::from_str(yaml_text).ok();
|
||||||
|
//! let cfg: AppConfig = AppConfig::from_file(file);
|
||||||
|
//! println!("{cfg:#?}");
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
|
//! ## Feature flags
|
||||||
|
//!
|
||||||
|
//! - `merge`
|
||||||
|
//! If you enable the `merge` feature, the generated `<Name>File` struct will
|
||||||
|
//! also derive `merge::Merge`, and you can layer multiple partial files
|
||||||
|
//! together before calling `.from_file(...)`. Any field‐level merge strategy
|
||||||
|
//! annotations (`#[merge(...)]`) are applied automatically.
|
||||||
|
//!
|
||||||
|
//! ## Limitations
|
||||||
|
//!
|
||||||
|
//! - Only works on structs with _named_ fields (no tuple‐structs or enums).
|
||||||
|
//! - All fields without a `#[from_file(default = ...)]` must implement `Default`.
|
||||||
|
//!
|
||||||
|
//! ## License
|
||||||
|
//!
|
||||||
|
//! MIT OR Apache-2.0
|
||||||
|
|
||||||
mod from_file;
|
mod from_file;
|
||||||
|
|
||||||
pub(crate) use from_file::impl_from_file;
|
pub(crate) use from_file::impl_from_file;
|
||||||
@ -5,6 +78,10 @@ use proc_macro::TokenStream;
|
|||||||
use proc_macro_error::proc_macro_error;
|
use proc_macro_error::proc_macro_error;
|
||||||
use syn::{DeriveInput, parse_macro_input};
|
use syn::{DeriveInput, parse_macro_input};
|
||||||
|
|
||||||
|
/// Implements the `FromFile` derive macro.
|
||||||
|
///
|
||||||
|
/// This macro processes the `#[from_file]` attribute on structs to generate
|
||||||
|
/// code for loading data from files.
|
||||||
#[proc_macro_error]
|
#[proc_macro_error]
|
||||||
#[proc_macro_derive(FromFile, attributes(from_file))]
|
#[proc_macro_derive(FromFile, attributes(from_file))]
|
||||||
pub fn derive_from_file(input: TokenStream) -> TokenStream {
|
pub fn derive_from_file(input: TokenStream) -> TokenStream {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user