#indentation #error

confindent

⚙️ A configuration format based on indentation

11 releases (stable)

2.2.1 Mar 16, 2025
2.2.0 Jul 1, 2022
2.1.0 Apr 5, 2022
2.0.1 Jul 27, 2021
0.2.0 Jan 30, 2019

#77 in Configuration

Download history 11/week @ 2024-12-04 37/week @ 2024-12-11 4/week @ 2024-12-18 9/week @ 2025-01-08 13/week @ 2025-01-15 1/week @ 2025-01-22 4/week @ 2025-01-29 27/week @ 2025-02-05 21/week @ 2025-02-12 28/week @ 2025-02-26 2/week @ 2025-03-05 135/week @ 2025-03-12 15/week @ 2025-03-19

180 downloads per month

ISC license

39KB
945 lines

Confindent

Crates Docs Downloads GitHub workflows badge

Configuration by indentation. Like ~/.ssh/config.

Example, short and sweet

use confindent::Confindent;
use std::error::Error;

fn main() {
	let conf: Confindent = "User gennyble\n\tEmail gen@nyble.dev\n\tID 256".parse().unwrap();

	let user = conf.child("User").unwrap();
	let username = user.value().unwrap();
	let email = user.child_value("Email").unwrap();
	let id: usize = user.child_parse("ID").unwrap();

	println!("User {username}: {id} Contact: {email}");
}

Quickstart!

The format, briefly.

It's a kind of tree, key-value thing. Lines are key-value pairs, the value starting at the first space after the indent. You can add a child to a value by indenting it with spaces or tabs. Indent the same amount to add another child to that same value. Indent more than you did initially to add a grandchild. Don't mix spaces and tabs. Like this!

Root this is the root
	Child I'm a child!
	Child You can have multiple children with the same keys!
		Grandchild I'm a grandchild!

Using the crate, quickly! also, here are the docs again

Open and parse a file with Confindent::from_file. Pass it a path. It returns a Result<Confindent, ParseError>.

Get a direct child with the child(key) function. Key needs to be able to turn into a &str. This returns an Option<&Value>. Value is the main data-storing struct. You can get multiple Value of the same name with children(key), which returns a Vec<&Value>.

You can get a Value's value with value(). It returns an Option<&str>. Get an owned, Option<String> with value_owned(). If you want to check that a Value has a direct child but don't care about the value, use has_child(key). It returns bool for whether or not a child was found with that key.

Want to parse a possible value into a different type, T? Instead of value() use parse(). It returns Result<T, ValueParseError<T>>. That type may look weird and that's because it is. ValueParseError is an enum that can be NoValue or ParseError(error) where error is the error part of the Result that T::FromStr returns.

Don't want to call child(key) and then value() or parse()? You can use child_value(key) and child_parse(key) to do both of those at once. Both of these functions return what value() and parse() normally return, respectively. There's also child_owned() which is like value_owned() wherein it returns an Option<String> of a child's value.

No runtime deps