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
**I**/o
**N**egotiator
**G**enerator
## 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: …
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?