Crates.io | strung |
lib.rs | strung |
version | 0.1.4 |
source | src |
created_at | 2022-09-12 15:42:02.862568 |
updated_at | 2023-11-11 09:33:03.532136 |
description | Easy access of struct fields in strings using different/custom pre/postfix: "Hello, {field}" |
homepage | |
repository | https://github.com/dekirisu/strung/ |
max_upload_size | |
id | 663869 |
size | 60,854 |
🐠 add strung to the dependencies in the Cargo.toml
:
[dependencies]
strung = "0.1"
🦀 use/import everything of the prelude in rust:
use strung::prelude::*;
🦊 works for unnamed fields:
#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
let s: String = Struct("Bob", 10).strung("{0} is {1}th");
}
🦊 works for named fields:
#[derive(Strung)]
struct Struct {
name: &'static str,
pos: u32,
}
fn main(){
let s: String = Struct{name:"Bob", pos:10}.strung("{name} is {pos}th.");
// fields can also be addressed by their index
let z: String = Struct{name:"Bob", pos:10}.strung("{0} is {1}th.");
}
🐳 use #[igno]
, #[ignore]
,#[strung(igno)]
or #[strung(ignore)]
to make a field unavailable
🦞 if a field type doesn't implement Display, it has to be ignored!
struct NoDisplay;
#[derive(Strung)]
struct Struct (&'static str, u32, #[igno] NoDisplay);
fn main(){
let s: String = Struct("Bob", 10, NoDisplay)
.strung("{0} is {1}th, he won {2}!");
}
🐳 use #[cscd]
, #[cascade]
, #[strung(cscd)]
or #[strung(cascade)]
to cascade (recursion).
🐑 cascaded fields are ignored by default
🐔 use #[notice]
, #[ntce]
or inside #[strung(..)]
to make them available,
#[derive(Strung)]
struct Struct &'static str, u32);
#[derive(Strung)]
struct Cascade (u32, #[cscd] Struct);
fn main(){
let s: String = Cascade(11,Struct("Bob", 10))
.strung("{1.0} is {1.1}th for the {0}th time!");
// => Bob is 10th for the 11th time!
}
🐈 5 different prefabs are provided:
#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
let t = Struct("Bob", 10);
let s = t.strung_curly("{0} is {1}th.");
let s = t.strung_angle("<0> is <1>th.");
let s = t.strung_dollry("${0} is ${1}th.");
let s = t.strung_dollar("$0 is $1th.");
let s = t.strung_hashtag("#0 is #1th.");
}
🦊 you can also customize pre-/postfixes in different ways
🦅 globally - using static variables and .strung_static(..)
:
#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
strung::set_static("<",">");
let s: String = Struct("Bob", 10).strung_static("<0> is <1>th.");
}
🐎 per struct - this overrides the default .strung(..)
pre/postfix:
#[derive(Strung)]
#[strung("<",">")]
struct Struct (&'static str, u32);
fn main(){
let s: String = Struct("Bob", 10).strung("<0> is <1>th.");
}
🐍 per call - using parameters .strung_dynamic(pre,post,..)
:
#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
let s: String = Struct("Bob", 10).strung_dynamic("<",">","<0> is <1>th.");
}
🦎 per call - using generic const chars .strung_generic::<pre,post>(..)
:
#[derive(Strung)]
struct Struct (&'static str, u32);
fn main(){
let s: String = Struct("Bob", 10).strung_generic::<'<','>'>("<0> is <1>th.");
}
🐕 dynamic/generic/global have equal runtime speed
🐇 default/prefabs/per-struct are faster!
🐁 Using a string of ~650 chracters and 6 field placeholders:
🦕 Documentation
🦎 Changelog
🐱 GitHub
👾 Discord Server