Hullas bungacha manda journal entry Key Val dan tashkil topgan edi. Manabunday:
let entry = Entry::new(vec![
Field::string("_SYSTEMD_UNIT", "myapp.service"),
Field::string("PRIORITY", "6"),
Field::string("MESSAGE", "Application started"),
]);
Ammo bu narsa yomonam noise beradi. Rustda ham Haskell kabi
derive qilsa bo'ladi typeclasslarni. Shu ideya hayolga keldi. Yani manabunaqa qilsa bo'larmikan ?#[derive(JournalEntry)]
pub struct ServiceLog {
#[journal(rename = "_SYSTEMD_UNIT")]
pub unit: String,
#[journal(rename = "MESSAGE")]
pub message: String,
#[journal(rename = "PRIORITY")]
pub priority: u32,
}
Agar shunaqa bo'lsa man o'zim yasagan tipni osongina journal entryga ham o'gira olaman shu bilan birga type safety ham joyida qoladi. Undan tashqari log entrylar tag bilan ajratilgan bo'ladi constructor namega qarab bu esa journalda grouping kabi narsalar qilishga juda foydali.
Haskellda siz yozgan typeclassni derive qilish unchalik qiyin emas. GHC.Generics bilan ishingiz anchagina oson ham bitadi, bu mavzularda juda ko'p resurslar bor. Lekin rustda esa bunday mavzular haqida kerakli resurslar deyarli topolmadim. Topganim bitta shu HeapSize. Ishqilib anchagina FAFOlardan kegin bu narsani yedirdim vanihoyat man yozgan typeclassni derive qilsa bo'ladigan bo'ldi.
Implementation: https://gist.github.com/lambdajon/c815ea20b9743e69fba9911e7583d930
Aytgancha
FAFO -> Fuck Around and Find Out