//// Add-form decoding and genesis-event construction: the write surface the //// lexicon widened (sleeveGrade, rating, folder, price, counterparty) must //// decode correctly, reject an out-of-range rating, and land on the written //// record unchanged. import at_record/gen/defs import at_record_server/handlers/shelf.{ type AddForm, AddForm, add_form_decoder, genesis_event, } import at_record_server/provenance import gleam/json import gleam/option.{None, Some} import gleam/result fn decode_form(body: String) -> Result(AddForm, Nil) { json.parse(body, add_form_decoder()) |> result.replace_error(Nil) } pub fn add_form_decodes_the_widened_fields_test() { let body = "{\"title\":\"Spiderland\",\"artist\":\"Slint\",\"sleeveGrade\":\"VG+\",\"rating\":4,\"folder\":\"Rock A-M\",\"price\":{\"amount\":4000,\"currency\":\"EUR\"},\"counterparty\":\"Record shop\"}" let assert Ok(form) = decode_form(body) assert form.sleeve_grade == Some("VG+") assert form.rating == Some(4) assert form.folder == Some("Rock A-M") assert form.price == Some(defs.Price(amount: 4000, currency: "EUR")) assert form.counterparty == Some("Record shop") } pub fn add_form_omits_absent_widened_fields_test() { let body = "{\"title\":\"Spiderland\",\"artist\":\"Slint\"}" let assert Ok(form) = decode_form(body) assert form.sleeve_grade == None assert form.rating == None assert form.folder == None assert form.price == None assert form.counterparty == None } pub fn add_form_rejects_rating_below_one_test() { let body = "{\"title\":\"Spiderland\",\"artist\":\"Slint\",\"rating\":0}" assert decode_form(body) == Error(Nil) } pub fn add_form_rejects_rating_above_five_test() { let body = "{\"title\":\"Spiderland\",\"artist\":\"Slint\",\"rating\":6}" assert decode_form(body) == Error(Nil) } pub fn add_form_accepts_rating_at_bounds_test() { let assert Ok(low) = decode_form("{\"title\":\"t\",\"artist\":\"a\",\"rating\":1}") let assert Ok(high) = decode_form("{\"title\":\"t\",\"artist\":\"a\",\"rating\":5}") assert low.rating == Some(1) assert high.rating == Some(5) } fn blank_form() -> AddForm { AddForm( title: "Spiderland", artist: "Slint", format: None, year: None, status: "owned", media_grade: None, sleeve_grade: None, rating: None, folder: None, notes: None, thumb_url: None, cover_url: None, discogs_id: None, price: None, counterparty: None, ) } pub fn genesis_event_threads_the_widened_fields_onto_the_record_test() { let form = AddForm( ..blank_form(), sleeve_grade: Some("NM"), rating: Some(5), folder: Some("Rock A-M"), price: Some(defs.Price(amount: 4000, currency: "EUR")), counterparty: Some("Record shop"), ) let event = genesis_event( form, None, None, provenance.source("manual"), None, "2026-01-01T00:00:00Z", ) assert event.sleeve_grade == Some("NM") assert event.rating == Some(5) assert event.folder == Some("Rock A-M") assert event.price == Some(defs.Price(amount: 4000, currency: "EUR")) assert event.counterparty == Some("Record shop") } pub fn genesis_event_omits_absent_widened_fields_test() { let event = genesis_event( blank_form(), None, None, provenance.source("manual"), None, "2026-01-01T00:00:00Z", ) assert event.sleeve_grade == None assert event.rating == None assert event.folder == None assert event.price == None assert event.counterparty == None }