CodeYourFuture / CodeYourFuture/trainee-tracker
Migrate sheets reading to use serde
- Vorherrschende Sprache
- Rust
- Sterne
- 0
- Forks
- 0
- Ø Merge
- 20 Min.
- Gemergte PRs (30 T.)
- 2
Beschreibung
We have a bunch of structs which we fill from Google Sheets, one per row, e.g.
https://github.com/CodeYourFuture/trainee-tracker/blob/aa0d5787598ab8191f6429b6858f3b62dd2a6f9f/src/prs.rs#L217-L224
We currently do this in an annoyingly manual and inflexible way.
For this particular struct, we populate it here:
https://github.com/CodeYourFuture/trainee-tracker/blob/aa0d5787598ab8191f6429b6858f3b62dd2a6f9f/src/reviewer_staff_info.rs#L48-L79
We ignore the headings completely, so if someone changed the sheet, we would start reading incorrect values. Then we hard-code the field order and types of each cell.
In other places, we manually check headings, and just error if they're wrong: https://github.com/CodeYourFuture/trainee-tracker/blob/aa0d5787598ab8191f6429b6858f3b62dd2a6f9f/src/register.rs#L105-L160
We also handle partial rows poorly.
I would love instead for us to just use `serde`. We could derive `Deserialize` for each struct we populate, and use a `serde` adaptor to read the sheet into a `Vec`.
There is an existing [`serde_sheets` crate](https://crates.io/crates/serde_sheets) for doing this, but it has some issues. If it runs into issues with a row, it just prints an error to stdout and continues (https://docs.rs/serde_sheets/latest/src/serde_sheets/lib.rs.html#200).
Ideally we would either improve this crate, or write our own one. I'm imagining supporting a function along the lines of:
```rust
pub async fn read_all(
sheets: &mut Sheets,
document_id: &str,
tab_name: &str,
) -> SheetReadResult;
enum SheetReadResult {
AllOk(Vec),
SomeOk {
ok: Vec,
partial_records: Vec,
deserialization_error_records: Vec<(Record, serde::Error)>,
},
Err(SheetsError),
}
struct Record {
row_number: usize,
cells: Vec,
}
```
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Rechercherichtung
Beginne damit, die Pfade zum Lesen von Tabellen in src/prs.rs, src/reviewer_staff_info.rs und src/register.rs zu vergleichen, und untersuche anschließend das im Issue verlinkte Verhalten von serde_sheets. Lege fest, ob serde_sheets verbessert oder ein Adapter erstellt werden soll, einschließlich der Darstellung von Headern, unvollständigen Zeilen und Deserialisierungsfehlern. Als erledigt gilt die Aufgabe, wenn die relevanten Structs aus Tabellen gelesen werden können, ohne die derzeitige manuelle Feldverarbeitung, und Fehler zurückgegeben statt ausgegeben und ignoriert werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- rust
- Bereich
- data-engineering
- Issue-Typ
- Refactoring
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100