use rquickjs::{Ctx, JsLifetime};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Identity {
pub name: String,
pub version: String,
}
impl Default for Identity {
fn default() -> Self {
Self {
name: "ferrijs".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
}
}
}
impl Identity {
#[must_use]
pub fn new(name: impl Into<String>, version: impl Into<String>) -> Self {
Self {
name: name.into(),
version: version.into(),
}
}
#[must_use]
pub fn user_agent(&self) -> String {
format!("{}/{}", self.name, self.version)
}
}
#[must_use]
pub fn quickjs_version() -> &'static str {
#[allow(unsafe_code)]
unsafe {
std::ffi::CStr::from_ptr(rquickjs::qjs::JS_GetVersion())
}
.to_str()
.unwrap_or("unknown")
}
struct IdentityUd(Identity);
#[allow(unsafe_code)]
unsafe impl JsLifetime<'_> for IdentityUd {
type Changed<'to> = IdentityUd;
}
pub fn set(ctx: &Ctx<'_>, identity: Identity) {
let _ = ctx.store_userdata(IdentityUd(identity));
}
#[must_use]
pub fn get(ctx: &Ctx<'_>) -> Identity {
ctx.userdata::<IdentityUd>().map_or_else(Identity::default, |ud| ud.0.clone())
}