use super::{
super::{context::*, errors::*, url::*},
internal_url::*,
metadata::*,
registered::*,
};
use kutil::io::reader::*;
impl UrlContext {
pub fn internal_url(
self: &UrlContextRef,
path: String,
host: Option<String>,
query: Option<UrlQuery>,
fragment: Option<String>,
) -> UrlRef {
InternalUrl::new(self, path, false, None, host, query, fragment).into()
}
pub fn register_internal_url(
self: &UrlContextRef,
path: String,
slashable: bool,
base_path: Option<String>,
format: Option<String>,
content: &[u8],
) -> Result<(), UrlError> {
let mut url_registry = self.internal_url_registry.lock()?;
url_registry.insert(path, RegisteredInternalUrl::new(slashable, base_path, format, content));
Ok(())
}
pub fn deregister_internal_url(self: &UrlContextRef, path: &String) -> Result<(), UrlError> {
let mut url_registry = self.internal_url_registry.lock()?;
url_registry.remove(path);
Ok(())
}
pub fn update_internal_url(self: &UrlContextRef, path: &String, content: &[u8]) -> Result<bool, UrlError> {
let mut url_registry = self.internal_url_registry.lock()?;
Ok(match url_registry.get_mut(path) {
Some(registered_internal_url) => {
registered_internal_url.content = ReadableBuffer::new(content);
true
}
None => false,
})
}
pub fn register_global_internal_url(
path: String,
slashable: bool,
base_path: Option<String>,
format: Option<String>,
content: &[u8],
) -> Result<(), UrlError> {
let mut url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
url_registry.insert(path, RegisteredInternalUrl::new(slashable, base_path, format, content));
Ok(())
}
pub fn deregister_global_internal_url(path: &String) -> Result<(), UrlError> {
let mut url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
url_registry.remove(path);
Ok(())
}
pub fn update_global_internal_url(path: &String, content: &[u8]) -> Result<bool, UrlError> {
let mut url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
Ok(match url_registry.get_mut(path) {
Some(registered_internal_url) => {
registered_internal_url.content = ReadableBuffer::new(content);
true
}
None => false,
})
}
pub fn read_internal_url(self: &UrlContextRef, path: &String) -> Result<Option<ReadableBufferReader>, UrlError> {
let url_registry = self.internal_url_registry.lock()?;
if let Some(registered_internal_url) = url_registry.get(path) {
return Ok(Some(registered_internal_url.content.reader()));
}
let url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
Ok(url_registry.get(path).map(|url| url.content.reader()))
}
pub fn internal_url_metadata(self: &UrlContextRef, path: &String) -> Result<Option<InternalUrlMetadata>, UrlError> {
let url_registry = self.internal_url_registry.lock()?;
if let Some(registered_internal_url) = url_registry.get(path) {
return Ok(Some(registered_internal_url.metadata.clone()));
}
let url_registry = GLOBAL_INTERNAL_URL_REGISTRY.lock()?;
Ok(url_registry.get(path).map(|url| url.metadata.clone()))
}
}