#indentation #configuration #config-format #ssh

confindent

⚙️ A configuration format based on indentation

10 releases (stable)

2.2.0 Jul 1, 2022
2.0.1 Jul 27, 2021
1.1.1 Feb 4, 2020
1.1.0 Jun 17, 2019
0.2.0 Jan 30, 2019

#369 in Configuration

49 downloads per month

ISC license

28KB
527 lines

Confindent

Crates Docs Downloads GitHub workflows badge

Configuration by indentation. Read the spec inspired by the format of the ssh client configuration commonly found on Linux machines at ~/.ssh/config.

Example, short and sweet

use confindent::Confindent;

fn main() {
	let conf: Confindent = "Pet Dog\n\tName Brady\n\tAge 10".parse().unwrap();
	let pet = conf.child("Pet").unwrap();
	let name = pet.child_value("Name").unwrap();
	let age: usize = pet.child_parse("Age").unwrap();

	let word = match pet.value() {
		Some("Dog") => "pupper",
		Some("Cat") => "kitty",
		_ => panic!(),
	};

	if age > 9 {
		println!("{}! {} is an old {}.", age, name, word);
	} else {
		println!("Only {}! {} is a good, young {}.", age, name, word);
	}
}

Quickstart!

The format, briefly. here's the very verbose spec

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