CodeYourFuture / CodeYourFuture/trainee-tracker

Migrate sheets reading to use serde

Offen
#39 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.