summaryrefslogtreecommitdiff
path: root/core/gotham_state.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/gotham_state.rs')
-rw-r--r--core/gotham_state.rs193
1 files changed, 0 insertions, 193 deletions
diff --git a/core/gotham_state.rs b/core/gotham_state.rs
deleted file mode 100644
index 422499f2f..000000000
--- a/core/gotham_state.rs
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
-// Forked from Gotham:
-// https://github.com/gotham-rs/gotham/blob/bcbbf8923789e341b7a0e62c59909428ca4e22e2/gotham/src/state/mod.rs
-// Copyright 2017 Gotham Project Developers. MIT license.
-
-use log::trace;
-use std::any::type_name;
-use std::any::Any;
-use std::any::TypeId;
-use std::collections::BTreeMap;
-
-#[derive(Default)]
-pub struct GothamState {
- data: BTreeMap<TypeId, Box<dyn Any>>,
-}
-
-impl GothamState {
- /// Puts a value into the `GothamState` storage. One value of each type is retained.
- /// Successive calls to `put` will overwrite the existing value of the same
- /// type.
- pub fn put<T: 'static>(&mut self, t: T) {
- let type_id = TypeId::of::<T>();
- trace!(" inserting record to state for type_id `{:?}`", type_id);
- self.data.insert(type_id, Box::new(t));
- }
-
- /// Determines if the current value exists in `GothamState` storage.
- pub fn has<T: 'static>(&self) -> bool {
- let type_id = TypeId::of::<T>();
- self.data.get(&type_id).is_some()
- }
-
- /// Tries to borrow a value from the `GothamState` storage.
- pub fn try_borrow<T: 'static>(&self) -> Option<&T> {
- let type_id = TypeId::of::<T>();
- trace!(" borrowing state data for type_id `{:?}`", type_id);
- self.data.get(&type_id).and_then(|b| b.downcast_ref())
- }
-
- /// Borrows a value from the `GothamState` storage.
- pub fn borrow<T: 'static>(&self) -> &T {
- self.try_borrow().unwrap_or_else(|| missing::<T>())
- }
-
- /// Tries to mutably borrow a value from the `GothamState` storage.
- pub fn try_borrow_mut<T: 'static>(&mut self) -> Option<&mut T> {
- let type_id = TypeId::of::<T>();
- trace!(" mutably borrowing state data for type_id `{:?}`", type_id);
- self.data.get_mut(&type_id).and_then(|b| b.downcast_mut())
- }
-
- /// Mutably borrows a value from the `GothamState` storage.
- pub fn borrow_mut<T: 'static>(&mut self) -> &mut T {
- self.try_borrow_mut().unwrap_or_else(|| missing::<T>())
- }
-
- /// Tries to move a value out of the `GothamState` storage and return ownership.
- pub fn try_take<T: 'static>(&mut self) -> Option<T> {
- let type_id = TypeId::of::<T>();
- trace!(
- " taking ownership from state data for type_id `{:?}`",
- type_id
- );
- self
- .data
- .remove(&type_id)
- .and_then(|b| b.downcast().ok())
- .map(|b| *b)
- }
-
- /// Moves a value out of the `GothamState` storage and returns ownership.
- ///
- /// # Panics
- ///
- /// If a value of type `T` is not present in `GothamState`.
- pub fn take<T: 'static>(&mut self) -> T {
- self.try_take().unwrap_or_else(|| missing::<T>())
- }
-}
-
-fn missing<T: 'static>() -> ! {
- panic!(
- "required type {} is not present in GothamState container",
- type_name::<T>()
- );
-}
-
-#[cfg(test)]
-mod tests {
- use super::GothamState;
-
- struct MyStruct {
- value: i32,
- }
-
- struct AnotherStruct {
- value: &'static str,
- }
-
- type Alias1 = String;
- type Alias2 = String;
-
- #[test]
- fn put_borrow1() {
- let mut state = GothamState::default();
- state.put(MyStruct { value: 1 });
- assert_eq!(state.borrow::<MyStruct>().value, 1);
- }
-
- #[test]
- fn put_borrow2() {
- let mut state = GothamState::default();
- assert!(!state.has::<AnotherStruct>());
- state.put(AnotherStruct { value: "a string" });
- assert!(state.has::<AnotherStruct>());
- assert!(!state.has::<MyStruct>());
- state.put(MyStruct { value: 100 });
- assert!(state.has::<MyStruct>());
- assert_eq!(state.borrow::<MyStruct>().value, 100);
- assert_eq!(state.borrow::<AnotherStruct>().value, "a string");
- }
-
- #[test]
- fn try_borrow() {
- let mut state = GothamState::default();
- state.put(MyStruct { value: 100 });
- assert!(state.try_borrow::<MyStruct>().is_some());
- assert_eq!(state.try_borrow::<MyStruct>().unwrap().value, 100);
- assert!(state.try_borrow::<AnotherStruct>().is_none());
- }
-
- #[test]
- fn try_borrow_mut() {
- let mut state = GothamState::default();
- state.put(MyStruct { value: 100 });
- if let Some(a) = state.try_borrow_mut::<MyStruct>() {
- a.value += 10;
- }
- assert_eq!(state.borrow::<MyStruct>().value, 110);
- }
-
- #[test]
- fn borrow_mut() {
- let mut state = GothamState::default();
- state.put(MyStruct { value: 100 });
- {
- let a = state.borrow_mut::<MyStruct>();
- a.value += 10;
- }
- assert_eq!(state.borrow::<MyStruct>().value, 110);
- assert!(state.try_borrow_mut::<AnotherStruct>().is_none());
- }
-
- #[test]
- fn try_take() {
- let mut state = GothamState::default();
- state.put(MyStruct { value: 100 });
- assert_eq!(state.try_take::<MyStruct>().unwrap().value, 100);
- assert!(state.try_take::<MyStruct>().is_none());
- assert!(state.try_borrow_mut::<MyStruct>().is_none());
- assert!(state.try_borrow::<MyStruct>().is_none());
- assert!(state.try_take::<AnotherStruct>().is_none());
- }
-
- #[test]
- fn take() {
- let mut state = GothamState::default();
- state.put(MyStruct { value: 110 });
- assert_eq!(state.take::<MyStruct>().value, 110);
- assert!(state.try_take::<MyStruct>().is_none());
- assert!(state.try_borrow_mut::<MyStruct>().is_none());
- assert!(state.try_borrow::<MyStruct>().is_none());
- }
-
- #[test]
- fn type_alias() {
- let mut state = GothamState::default();
- state.put::<Alias1>("alias1".to_string());
- state.put::<Alias2>("alias2".to_string());
- assert_eq!(state.take::<Alias1>(), "alias2");
- assert!(state.try_take::<Alias1>().is_none());
- assert!(state.try_take::<Alias2>().is_none());
- }
-
- #[test]
- #[should_panic(
- expected = "required type deno_core::gotham_state::tests::MyStruct is not present in GothamState container"
- )]
- fn missing() {
- let state = GothamState::default();
- let _ = state.borrow::<MyStruct>();
- }
-}