read_url/internal/
context.rs

1use super::{
2    super::{context::*, errors::*, url::*},
3    internal_url::*,
4    metadata::*,
5    registered::*,
6};
7
8use kutil::io::reader::*;
9
10impl UrlContext {
11    /// Construct an [InternalUrl].
12    pub fn internal_url(
13        self: &UrlContextRef,
14        path: String,
15        host: Option<String>,
16        query: Option<UrlQuery>,
17        fragment: Option<String>,
18    ) -> UrlRef {
19        InternalUrl::new(self, path, false, None, host, query, fragment).into()
20    }
21
22    /// Register an [InternalUrl].
23    pub fn register_internal_url(
24        self: &UrlContextRef,
25        path: String,
26        slashable: bool,
27        base_path: Option<String>,
28        format: Option<String>,
29        content: &[u8],
30    ) -> Result<(), UrlError> {
31        let mut url_registry = self.internal_url_registry.lock()?;
32        url_registry.insert(path, RegisteredInternalUrl::new(slashable, base_path, format, content));
33        Ok(())
34    }
35
36    /// Deregister an [InternalUrl].
37    pub fn deregister_internal_url(self: &UrlContextRef, path: &String) -> Result<(), UrlError> {
38        let mut url_registry = self.internal_url_registry.lock()?;
39        url_registry.remove(path);
40        Ok(())
41    }
42
43    /// Update the content of an [InternalUrl].
44    pub fn update_internal_url(self: &UrlContextRef, path: &String, content: &[u8]) -> Result<bool, UrlError> {
45        let mut url_registry = self.internal_url_registry.lock()?;
46        Ok(match url_registry.get_mut(path) {
47            Some(registered_internal_url) => {
48                registered_internal_url.content = ReadableBuffer::new(content);
49                true
50            }
51
52            None => false,
53        })
54    }
55
56    /// Register a global [InternalUrl].
57    pub fn register_global_internal_url(
58        path: String,
59        slashable: bool,
60        base_path: Option<String>,
61        format: Option<String>,
62        content: &[u8],
63    ) -> Result<(), UrlError> {
64        let mut url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
65        url_registry.insert(path, RegisteredInternalUrl::new(slashable, base_path, format, content));
66        Ok(())
67    }
68
69    /// Deregister a global [InternalUrl].
70    pub fn deregister_global_internal_url(path: &String) -> Result<(), UrlError> {
71        let mut url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
72        url_registry.remove(path);
73        Ok(())
74    }
75
76    /// Update the content of a global [InternalUrl].
77    pub fn update_global_internal_url(path: &String, content: &[u8]) -> Result<bool, UrlError> {
78        let mut url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
79        Ok(match url_registry.get_mut(path) {
80            Some(registered_internal_url) => {
81                registered_internal_url.content = ReadableBuffer::new(content);
82                true
83            }
84
85            None => false,
86        })
87    }
88
89    /// Read an [InternalUrl]'s content.
90    ///
91    /// Tries the context's registry first, the global registry next.
92    pub fn read_internal_url(self: &UrlContextRef, path: &String) -> Result<Option<ReadableBufferReader>, UrlError> {
93        // Try context registry first
94        let url_registry = self.internal_url_registry.lock()?;
95        if let Some(registered_internal_url) = url_registry.get(path) {
96            return Ok(Some(registered_internal_url.content.reader()));
97        }
98
99        // Then the global registry
100        let url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
101        Ok(url_registry.get(path).map(|url| url.content.reader()))
102    }
103
104    /// Access an [InternalUrl]'s metadata.
105    ///
106    /// Tries the context's registry first, the global registry next.
107    pub fn internal_url_metadata(self: &UrlContextRef, path: &String) -> Result<Option<InternalUrlMetadata>, UrlError> {
108        // Try context registry first
109        let url_registry = self.internal_url_registry.lock()?;
110        if let Some(registered_internal_url) = url_registry.get(path) {
111            return Ok(Some(registered_internal_url.metadata.clone()));
112        }
113
114        // Then the global registry
115        let url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
116        Ok(url_registry.get(path).map(|url| url.metadata.clone()))
117    }
118}