summaryrefslogtreecommitdiff
path: root/protocol/src/context.rs
diff options
context:
space:
mode:
Diffstat (limited to 'protocol/src/context.rs')
-rw-r--r--protocol/src/context.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/protocol/src/context.rs b/protocol/src/context.rs
new file mode 100644
index 0000000..4fdddb9
--- /dev/null
+++ b/protocol/src/context.rs
@@ -0,0 +1,71 @@
+use framework::space::{Space, SpaceRoot};
+
+pub struct ProtocolContext<User, Server>
+where
+ User: SpaceRoot,
+ Server: SpaceRoot,
+{
+ /// Current context's Vault
+ pub remote: Option<Space<Server>>,
+
+ /// Current context's Workspace
+ pub user: Option<Space<User>>,
+}
+
+impl<User, Server> ProtocolContext<User, Server>
+where
+ User: SpaceRoot,
+ Server: SpaceRoot,
+{
+ /// Create a new local context with a user
+ pub fn new_local(user: Space<User>) -> Self {
+ Self {
+ remote: None,
+ user: Some(user),
+ }
+ }
+
+ /// Create a new remote context with a server
+ pub fn new_remote(server: Space<Server>) -> Self {
+ Self {
+ remote: Some(server),
+ user: None,
+ }
+ }
+}
+
+impl<User, Server> ProtocolContext<User, Server>
+where
+ User: SpaceRoot,
+ Server: SpaceRoot,
+{
+ /// Check if the context is remote (has a server)
+ pub fn is_remote(&self) -> bool {
+ self.remote.is_some()
+ }
+
+ /// Check if the context is local (has a user)
+ pub fn is_local(&self) -> bool {
+ self.user.is_some()
+ }
+
+ /// Get the remote vault if it exists
+ pub fn remote(&self) -> Option<&Space<Server>> {
+ self.remote.as_ref()
+ }
+
+ /// Get the local workspace if it exists
+ pub fn local(&self) -> Option<&Space<User>> {
+ self.user.as_ref()
+ }
+
+ /// Unwrap the local workspace, panics if not local
+ pub fn unwrap_local(&self) -> &Space<User> {
+ self.user.as_ref().expect("Not a local context")
+ }
+
+ /// Unwrap the remote vault, panics if not remote
+ pub fn unwrap_remote(&self) -> &Space<Server> {
+ self.remote.as_ref().expect("Not a remote context")
+ }
+}