{"record":{"id":"20965362b7e0a706","repo":"BoundaryML/baml","slug":"plaindate-to-plain-datetime-expected-plaindate-instance","errorCode":null,"errorMessage":"PlainDate.to_plain_datetime: expected PlainDate instance","messagePattern":"PlainDate\\.to_plain_datetime: expected PlainDate instance","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"baml_language/crates/bex_vm/src/package_baml/time.rs","lineNumber":227,"sourceCode":"            _days: days_since_epoch(date),\n        };\n        Ok(plaindate.to_value(vm))\n    }\n\n    fn _to_string_impl(\n        plaindate: &view::time::PlainDate<'_>,\n    ) -> Result<bex_str::BexStr, VmRustFnError> {\n        let date = date_for_days(plaindate._days(), \"PlainDate.to_string\")?;\n        let mut out = String::new();\n        format_date_into(&mut out, date);\n        Ok(bex_str::BexStr::from(out))\n    }\n\n    fn _to_plain_datetime(vm: &mut BexVm, plaindate: &Value, time_ns: i64) -> Value {\n        let days = {\n            let instance = vm\n                .as_instance(plaindate)\n                .expect(\"PlainDate.to_plain_datetime: expected PlainDate instance\");\n            view::time::PlainDate { instance }._days()\n        };\n        let civil = i128::from(days) * NANOS_PER_DAY + i128::from(time_ns);\n        let plaindatetime = copy::time::PlainDateTime {\n            _nanoseconds: Arc::new(num_bigint::BigInt::from(civil)),\n        };\n        plaindatetime.to_value(vm)\n    }\n\n    fn year(plaindate: &view::time::PlainDate<'_>) -> Result<i64, VmRustFnError> {\n        Ok(i64::from(\n            date_for_days(plaindate._days(), \"PlainDate.year\")?.year(),\n        ))\n    }\n\n    fn month(plaindate: &view::time::PlainDate<'_>) -> Result<i64, VmRustFnError> {\n        Ok(i64::from(u8::from(\n            date_for_days(plaindate._days(), \"PlainDate.month\")?.month(),","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/baml_language/crates/bex_vm/src/package_baml/time.rs#L209-L245","documentation":"Panic in PlainDate.to_plain_datetime: the receiver value is not a PlainDate instance, so extracting its internal days field fails. The method's receiver must always be a PlainDate instance per the time library's invariants.","triggerScenarios":"Calling to_plain_datetime with a receiver value that is not a PlainDate instance — e.g. passing a PlainDateTime, a raw value, or an object of the wrong class.","commonSituations":"Mixing up PlainDate and PlainDateTime/PlainTime values; passing stored values of the wrong type recovered from dynamic data; calling internal methods on wrongly-typed receivers.","solutions":["Verify the receiver is constructed via PlainDate constructor APIs before calling to_plain_datetime.","If you have a PlainDateTime, use its appropriate conversion method instead.","Add a type check on the value before the call."],"exampleFix":"// before\nlet dt = plaindatetime.to_plain_datetime(t)\n// after\nlet dt = plaindate.to_plain_datetime(t)  // ensure receiver is a PlainDate","handlingStrategy":"type-guard","validationCode":"// before the call\nif (typeof value.className !== 'undefined' && value.className !== 'PlainDate') throw new Error('receiver must be a PlainDate');","typeGuard":"function isPlainDate(v) { return v != null && v.className === 'PlainDate'; }","tryCatchPattern":null,"preventionTips":["Only call date/time methods on values from the matching constructors.","Do not confuse PlainDate and PlainDateTime values."],"tags":["vm-panic","invariant","time","receiver-type"],"backgroundTag":"type-mismatch","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}