No description
Find a file
Thelie e4b19cba5d Update 'README.md'
Added example and more explaination of how the macros work.
2022-03-27 15:20:14 +02:00
sing_macros Basic functionality of the crate is now present. 2022-03-26 23:06:38 +01:00
sing_parse Basic functionality of the crate is now present. 2022-03-26 23:06:38 +01:00
sing_util Basic functionality of the crate is now present. 2022-03-26 23:06:38 +01:00
src Basic functionality of the crate is now present. 2022-03-26 23:06:38 +01:00
.gitignore Initial commit 2022-02-19 11:37:31 +01:00
Cargo.toml Basic functionality of the crate is now present. 2022-03-26 23:06:38 +01:00
LICENSE.md Renamed license file 2022-03-26 23:25:16 +01:00
README.md Update 'README.md' 2022-03-27 15:20:14 +02:00
TODO Update 'TODO' 2022-03-26 23:15:57 +01:00

Sing

Std

I/o

Negotiator

Generator

What is sing meant to be?

This crate is meant to create interfaces between traits in Rust libraries and the command line. It does this by providing two macros:

  • sing_add_trait, which acts as an attribute to a trait implementation and gathers the method signatures that are used by sing_loop!.
  • sing_loop!, which takes a trait object and serialization/deserialization functions as well as some optional parameters. It generates a loop parsing function calls coming from STDIN (or any other BufRead stream), evaluating them by calling the appropriate method on the object and returning them on STDOUT (or any other Write stream).

Example usage

use serde::{Serialize, Deserialize};
use sing::{sing_add_trait, sing_loop};

trait FruitTree {
         fn shake(&self, shakes: u32) -> Vec<Fruit>;
}

#[derive(Debug, Serialize, Deserialize)]
struct Fruit {
         fruit_type: String,
}

struct BananaTree;

#[sing_add_trait()]
impl FruitTree for BananaTree {
         fn shake(&self, shakes: u32) -> Vec<Fruit>{
                  let mut out = vec!();

                  for _ in 0..shakes {
                                out.push(Fruit{fruit_type: String::from("Banana")});
                  }
                  
                  out
         }
}

fn main() {
         let tree = BananaTree {};
         
    sing_loop!(tree, [different, ron::to_string, ron::from_str],);
}

Negotiator? Really?

Yes, it's somewhat far-fetched, but I really wanted to be able to sing and clap in my rusty command-line projects.

Why the name?

See above.