use boa_cat::Value;
use boa_cat::heap::Heap;
use boa_cat::value::ObjectId;
pub const PROPERTY_KEY: &str = "cookie";
#[must_use]
pub fn set_document_cookie(document_value: &Value, heap: Heap, cookies: &str) -> Heap {
let pair =
object_id_of(document_value).and_then(|id| heap.object(id).cloned().map(|obj| (id, obj)));
let cookies_owned = cookies.to_owned();
pair.into_iter().fold(heap, |heap, (id, obj)| {
let updated = obj.with(
PROPERTY_KEY.to_owned(),
Value::String(cookies_owned.clone()),
);
heap.store_object(id, updated).unwrap_or_else(|h| h)
})
}
#[must_use]
pub fn get_document_cookie(document_value: &Value, heap: &Heap) -> Option<String> {
let id = object_id_of(document_value)?;
let obj = heap.object(id)?;
obj.get(PROPERTY_KEY).and_then(|value| match value {
Value::String(s) => Some(s.clone()),
Value::Undefined
| Value::Null
| Value::Boolean(_)
| Value::Number(_)
| Value::Object(_)
| Value::Function(_)
| Value::Native(_) => None,
})
}
fn object_id_of(value: &Value) -> Option<ObjectId> {
match value {
Value::Object(id) => Some(*id),
Value::Undefined
| Value::Null
| Value::Boolean(_)
| Value::Number(_)
| Value::String(_)
| Value::Function(_)
| Value::Native(_) => None,
}
}