use crate::{
builtins::promise::OperationType,
job::JobCallback,
object::{JsFunction, JsObject},
realm::Realm,
Context, JsResult, JsValue,
};
use chrono::{DateTime, FixedOffset, Local, LocalResult, NaiveDateTime, TimeZone, Utc};
use super::intrinsics::Intrinsics;
pub trait HostHooks {
fn make_job_callback(&self, callback: JsFunction, _context: &mut Context<'_>) -> JobCallback {
JobCallback::new(callback, ())
}
fn call_job_callback(
&self,
job: JobCallback,
this: &JsValue,
args: &[JsValue],
context: &mut Context<'_>,
) -> JsResult<JsValue> {
job.callback().call(this, args, context)
}
fn promise_rejection_tracker(
&self,
_promise: &JsObject,
_operation: OperationType,
_context: &mut Context<'_>,
) {
}
fn ensure_can_compile_strings(
&self,
_realm: Realm,
_context: &mut Context<'_>,
) -> JsResult<()> {
Ok(())
}
fn has_source_text_available(
&self,
_function: &JsFunction,
_context: &mut Context<'_>,
) -> bool {
true
}
fn ensure_can_add_private_element(
&self,
_o: &JsObject,
_context: &mut Context<'_>,
) -> JsResult<()> {
Ok(())
}
fn create_global_object(&self, intrinsics: &Intrinsics) -> JsObject {
JsObject::with_object_proto(intrinsics)
}
fn create_global_this(&self, _intrinsics: &Intrinsics) -> Option<JsObject> {
None
}
fn utc_now(&self) -> NaiveDateTime {
Utc::now().naive_utc()
}
fn local_from_utc(&self, utc: NaiveDateTime) -> DateTime<FixedOffset> {
let offset = Local.offset_from_utc_datetime(&utc);
DateTime::from_utc(utc, offset)
}
fn local_from_naive_local(&self, local: NaiveDateTime) -> LocalResult<DateTime<FixedOffset>> {
Local
.offset_from_local_datetime(&local)
.map(|offset| DateTime::from_local(local, offset))
}
}
#[derive(Debug, Clone, Copy)]
pub struct DefaultHooks;
impl HostHooks for DefaultHooks {}