Added license, README and other minor things #1

Merged
Thelie merged 10 commits from thelie-patch-1 into main 2022-03-27 15:39:44 +02:00
Showing only changes of commit e4b19cba5d - Show all commits

View file

@ -2,19 +2,56 @@
**S**td **S**td
**I**/o **I**/o
**N**egotiator **N**egotiator
**G**enerator **G**enerator
## What is sing meant to be? ## What is sing meant to be?
This crate is meant to create interfaces between traits in Rust libraries and the command line. This crate is meant to create interfaces between traits in Rust libraries and the command line.
It does this by providing two macros: … 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
```rust
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? ## Negotiator? Really?