Skip to content

Configuration format based on indentation; Rust crate

License

Notifications You must be signed in to change notification settings

gennyble/confindent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

72 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.