Rust, Bot e Lemmy: Un piccolo esempio introduttorio!
Rust, Bot e Lemmy: Un piccolo esempio introduttorio!
Ciao a tutti! La discussione dell'altro giorno riguardo a Bot per Lemmy mi ha invogliato a perder un po' di tempo libero e buttare giù un semplicissimo script in Rust che crea un nuovo post quando viene invocato, seguendo i dati in un file di configurazione.
Anche se si tratta, fondamentalmente, di qualcosa d'incredibilmente semplice l'ho creato in modo da dar esempi pratici a molti degli argomenti che spesso, chi inizia Rust, ha difficoltà a trovare in un insieme coerente.
Per esser chiari questa non è - volutamente - la più efficiente o idiomatica versione del codice per eseguire il compito, ma ho cercato di mantenerla semplice da capire e tendenzialmente idiomatica, evitando tutte quelle forme che potrebbero intimidire o confondere, anche se migliori.
E, soprattutto, questo non è un tutorial. Vuole solo dare una prospettiva ampia.
Dentro ci sono esempi di:
- Option
- match
- Del crate reqwest, usato per inviare una richiesta POST.
- Come leggere un file di configurazione con toml e serde.
- Il random in Rust, che non è integrato direttamente nella Standard Library ma per cui bisogna usare il crate rand (o similari).
- Come ottenere e formattare una data con il crate time. Normalmente ho sempre usato chrono, quindi questa è stata un'esperienza nuova anche per me! haha
- Diversi modi per interpolare le stringhe.
- Come attivare per un crate delle feature non default nel proprio cargo.toml
- panic! AKA Come far crashare il proprio programma! ...volutamente!
- expect non è il male! Ha il suo posto anche all'interno di programmi più solidi e non solo per veloce prototipi.
Ora non voglio venderlo per più di quello che è, ma credo sia una buona base di partenza per qualcuno che è interessato a Rust ma non lo ha mai visto con esempi reali, semplici e non mono argomento. Ho aggiunto anche diversi commenti che spero possano aiutare a comprenderne il flusso.
Quindi, per finire, funziona? Sì! È solido e resiliente? Nope. È una buona base per far qualcosa di meglio se volessi imparare e giocare un po' con Rust? Credo di sì.
Se volete provarlo e fare dei test, il metodo migliore è usare le istanze di test ufficiali di Lemmy:
Oppure la palestra qui su feddit.it (credo?)
Una buona alternativa sono anche i servizi come https://httpbun.org/ o https://httpbin.org/ (down al momento dei miei test).
Alcune possibili migliorie semplici ed interessanti potrebbero esser:
- Una gestione migliore degli errori, usando l'operatore '?', ed il crate anyhow.
- Potremmo anche creare degli errori migliori con thiserror!
- Abbiamo già il crate time.. Perché non aggiungere dei timestamp ai messaggi nella console?
- Creare diversi moduli per gestire in modo più generale e specifico (Ah! Sembra un ossimoro ma non lo è!) le varie funzioni!
- Dopo aver creato la discussione, se ha accesso ai poteri da mod, pinnarla!
- Magari sanitizzare un po' le stringe provenienti dal file config? Anche solo un trim sarebbe un bel passo avanti! Anche quando l'utente è fidato cercare di coprire gli errori più comuni è sempre una buona idea!
- Cosa succede se il session_token è scaduto..? Magari si potrebbe direttamente fare il login?
- Magari trasformarlo per, oltre al file di configurazione, accettare anche dei parametri da linea di comando, usando un crate come Clap!
- Attualmente lo script posta quando è invocato.. Magari potremmo creare un loop e una configurazione per postare a determinate date/orari? Certo, un cron job quando disponibile è sempre la scelta migliore.. Ma se proprio ci si sta annoiando...!