#![allow(dead_code, unused_variables)]
use crate::{
builtins::{BuiltInBuilder, BuiltInConstructor, BuiltInObject, IntrinsicObject},
context::intrinsics::{Intrinsics, StandardConstructor, StandardConstructors},
object::internal_methods::get_prototype_from_constructor,
property::Attribute,
realm::Realm,
string::StaticJsStrings,
Context, JsData, JsNativeError, JsObject, JsResult, JsString, JsSymbol, JsValue,
};
use boa_gc::{Finalize, Trace};
use boa_profiler::Profiler;
use temporal_rs::{
components::{
calendar::{Calendar, GetTemporalCalendar},
DateTime, MonthDay as InnerMonthDay,
},
iso::IsoDateSlots,
};
#[derive(Debug, Clone, Trace, Finalize, JsData)]
#[boa_gc(unsafe_empty_trace)] pub struct PlainMonthDay {
pub(crate) inner: InnerMonthDay,
}
impl PlainMonthDay {
fn new(inner: InnerMonthDay) -> Self {
Self { inner }
}
}
impl IsoDateSlots for JsObject<PlainMonthDay> {
fn iso_date(&self) -> temporal_rs::iso::IsoDate {
self.borrow().data().inner.iso_date()
}
}
impl GetTemporalCalendar for JsObject<PlainMonthDay> {
fn get_calendar(&self) -> Calendar {
self.borrow().data().inner.get_calendar()
}
}
impl BuiltInObject for PlainMonthDay {
const NAME: JsString = StaticJsStrings::PLAIN_MD;
}
impl IntrinsicObject for PlainMonthDay {
fn init(realm: &Realm) {
let _timer = Profiler::global().start_event(std::any::type_name::<Self>(), "init");
BuiltInBuilder::from_standard_constructor::<Self>(realm)
.property(
JsSymbol::to_string_tag(),
Self::NAME,
Attribute::CONFIGURABLE,
)
.build();
}
fn get(intrinsics: &Intrinsics) -> JsObject {
Self::STANDARD_CONSTRUCTOR(intrinsics.constructors()).constructor()
}
}
impl BuiltInConstructor for PlainMonthDay {
const LENGTH: usize = 0;
const STANDARD_CONSTRUCTOR: fn(&StandardConstructors) -> &StandardConstructor =
StandardConstructors::plain_month_day;
fn constructor(
new_target: &JsValue,
args: &[JsValue],
context: &mut Context,
) -> JsResult<JsValue> {
Err(JsNativeError::range()
.with_message("Not yet implemented.")
.into())
}
}
pub(crate) fn create_temporal_month_day(
inner: InnerMonthDay,
new_target: Option<&JsValue>,
context: &mut Context,
) -> JsResult<JsValue> {
if DateTime::validate(&inner) {
return Err(JsNativeError::range()
.with_message("PlainMonthDay is not a valid ISO date time.")
.into());
}
let new_target = if let Some(target) = new_target {
target.clone()
} else {
context
.realm()
.intrinsics()
.constructors()
.plain_month_day()
.constructor()
.into()
};
let proto = get_prototype_from_constructor(
&new_target,
StandardConstructors::plain_month_day,
context,
)?;
let obj = JsObject::from_proto_and_data(proto, PlainMonthDay::new(inner));
Ok(obj.into())
}