Ranting ╰(°Д°)/ ========================== [github](https://github.com/RoelKluin/ranting.rs) [crates.io](https://crates.io/crates/ranting) [docs.rs](https://docs.rs/ranting/0.2.1/ranting/) This library provides [`Ranting`](https://docs.rs/ranting/0.2.1/ranting/trait.Ranting.html), a trait for inflection within [`say!()`](https://docs.rs/ranting_derive/0.2.1/ranting_derive/macro.say.html) litteral string placeholders. ```toml [dependencies] ranting = "0.2" ```
## Details - A `say!()` macro produces a String similar to `format!()`, but with placeholder markers a pronouns can be received. A verb alongside, always specified in plural, inflects accordingly. ```rust use ranting::*; use ranting_derive::*; fn say_this(who: Noun, title: &Noun) -> String { say!("{=who do} say {`who title are} {who}.") } fn main() { let title = Noun::new("name", "it"); assert_eq!( say_this(Noun::new("Jane", "I"), &title), "I do say my name is Jane.".to_string() ); assert_eq!( say_this(Noun::new("Tarzan", "he"), &title), "He does say his name is Tarzan.".to_string() ); } ``` - `Noun` is a struct with the `Ranting` trait. You can use `#[derive(Ranting)]` on a struct or enum for similar behavior. To specify the subject use I .. they, thou or ye. - A placeholder to display a Ranting variable has a structure like:
``{[,^]?(verb )?(article |`noun )?([+-]|([#$]|\?$)var )?[`=@~?*]?noun( verb):fmt}``
- With `,` and `^` lower- and uppercase are enforced, but a placeholder at sentence start is uppercase by default. Also an article or verb with an uppercase causess an uppercase for the first character. ```rust fn state(who: T, liberty: &str) -> String { say!("{haven't =who} a {liberty} to say {a who's} land is {~who}?") } #[derive_ranting] #[ranting(subject = "he")] struct Earl {} #[derive_ranting] #[ranting(subject = "they")] struct Farmers {} fn main() { assert_eq!( state(Earl {}, "right"), "Hasn't he a right to say an earl's land is his?".to_string() ); assert_eq!( state(Farmers {}, "right"), "Haven't they a right to say some farmers' land is theirs?".to_string() ); } ``` - An article, possesive `'s` or verbs before the noun are also adapted. Normal placeholders just follow their Display or Debug traits within `say!()`. - A given Ranting Enum or Struct can also be inflected to plural or singular. To force plurality use `+`, for a singular use `-`. If prependeded by `$var` or `#var`, plurality of the noun is adapted to the numeric variable var. Which is displayed, unless prepended with a '?'. The number is converted to a word for `#var`. Other words within the placeholder are adapted accordingly as well. - A Noun or pronoun is displayed dependent on its leading character or string marker. * `?` - subject in inflection, but neither variable nor its space is displayed. * `=` - subject * `@` - object * `` ` `` - possesive * `~` - adjective * `*` - display the name (as is the default) but also mark this word as the Ranting element in the placeholder. "A {*can can} contain water." (removed the mutname variant) - If a Noun or numeric plurality has a leading question mark, it is hidden but its inferred inflection does apply. - An 'article' can be one of `a`, `an`, `some`, `the`, `those` or `these`. These and those are converted to this and that if the pronoun is singular. A question mark indicates its display dependends (see no_article). - `ack!()` and `nay!()` provide an Ok() / Err() return with a `say!()` formatted string included. Intended for allow or deny ranting responses. Not for error handling, because true errors should be easy to search in code. - A struct can receive via attributes: * subject ["it"] - indicates the pronoun, if "$", the struct is assumed to contain a String 'subject' * name [Struct or Enum name; lowercase] - the display name. when "$' the struct contains a name String. * singular_end [""] - for inflection, what name + singular_end if the plurality is '-'? can also be "$" * plural_end ["s"] - likewise, name end if plurality is '+' or #var != 1. * is_plural [as subject] - if subject is "you", this indicates whether that means plural or not. * uc [false] - indicate if the word should always start with an uppercase. * no_article [false] - indicate that the word should be without article if the article if prepended with a '?'. say!("{?the 0} was great!", activity) // e.g. for activity = tennis with no_article=true. (The latter two do not yet have the "$" variant) Positional argument and numeric references are supported, but named arguments or empty arguments are not, currecntly. ``` fn main() { let thing = Noun::new("thing", "it"); assert_eq!(say!("this is {=thing}."), "this is it.".to_string()); assert_eq!(say!("this is {=0}.", thing), "this is it.".to_string()); // won't work: //assert_eq!("{}", say!("this is {=x}.", x = thing), "this is it.".to_string()); //assert_eq!("{}", say!("this is {=}.", thing), "this is it.".to_string()); } ```