use std::fmt::Debug;
use std::sync::Arc;
use oxinat_derive::{uri_builder_alias, UriBuilder};
use crate::uri::UriBuilder;
use crate::version::Version;
uri_builder_alias!(AdminUriBuilder);
ImplAdminUriBuilder! {
(String),
(DataTypesUriBuilder<'_>),
(ElementsUriBuilder<'_>),
(NamesUriBuilder<'_>),
(BuildInfoUriBuilder<'_>),
(UptimeUriBuilder<'_>),
(ValuesUriBuilder<'_>),
(IniUriBuilder<'_>),
(PropsUriBuilder<'_>)
}
ImplAdminUriBuilder! {
(SchemaUriBuilder<Parent>, Parent),
(SiteConfigUriBuilder<Parent>, Parent),
(SiteConfigUriBuilderLegacy<Parent>, Parent),
(PreferenceUriBuilder<Parent>, Parent),
}
#[derive(Clone, Debug, Default, UriBuilder)]
#[match_path(path = "{parent}/schemas")]
#[match_path(path = "{parent}/schemas/{schema}")]
#[match_path(path = "{parent}/{namespace}/{schema}")]
pub struct SchemaUriBuilder<Parent>
where
Parent: AdminUriBuilder,
{
#[param]
schema: Option<String>,
#[param]
namespace: Option<String>,
#[parent]
parent: Option<Arc<Parent>>
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/datatypes")]
pub struct DataTypesUriBuilder<'a>
{
#[parent]
parent: Option<&'a SchemaUriBuilder<String>>,
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/elements")]
#[match_path(path = "{parent}/elements/{data_type}")]
pub struct ElementsUriBuilder<'a>
{
#[param]
data_type: Option<String>,
#[parent]
parent: Option<&'a DataTypesUriBuilder<'a>>,
}
impl ElementsUriBuilder<'_>
{
pub fn build_all(&self) -> crate::BuildResult {
self.build_join("all")
}
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/names")]
#[match_path(path = "{parent}/names/{data_type}")]
pub struct NamesUriBuilder<'a>
{
#[param]
data_type: Option<String>,
#[parent]
parent: Option<&'a DataTypesUriBuilder<'a>>,
}
impl NamesUriBuilder<'_>
{
pub fn build_all(&self) -> crate::BuildResult {
self.build_join("all")
}
}
impl DataTypesUriBuilder<'_>
{
pub fn elements(&self) -> ElementsUriBuilder {
ElementsUriBuilder::from_parent(&Arc::new(self))
}
pub fn names(&self) -> NamesUriBuilder {
NamesUriBuilder::from_parent(&Arc::new(self))
}
}
impl SchemaUriBuilder<String>
{
pub fn datatypes(&self) -> DataTypesUriBuilder {
DataTypesUriBuilder::from_parent(&Arc::new(self))
}
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/siteConfig")]
#[match_path(path = "{parent}/siteConfig/{property}")]
pub struct SiteConfigUriBuilder<Parent>
where
Parent: AdminUriBuilder,
{
#[param]
property: Option<String>,
#[parent]
parent: Option<Arc<Parent>>
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/buildInfo")]
#[match_path(path = "{parent}/buildInfo/{property}")]
pub struct BuildInfoUriBuilder<'a>
{
#[param]
property: Option<String>,
#[parent]
parent: Option<&'a SiteConfigUriBuilder<String>>
}
impl BuildInfoUriBuilder<'_>
{
pub fn build_attributes(&self) -> crate::BuildResult {
self.build_join("attributes")
}
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/uptime")]
pub struct UptimeUriBuilder<'a>
{
#[parent]
parent: Option<&'a SiteConfigUriBuilder<String>>
}
impl UptimeUriBuilder<'_>
{
pub fn build_display(&self) -> crate::BuildResult {
self.build_join("display")
}
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/values/{preferences}")]
pub struct ValuesUriBuilder<'a>
{
#[param]
preferences: Option<String>,
#[parent]
parent: Option<&'a SiteConfigUriBuilder<String>>
}
impl SiteConfigUriBuilder<String>
{
pub fn build_info(&self) -> BuildInfoUriBuilder {
BuildInfoUriBuilder::from_parent(&Arc::new(self))
}
pub fn uptime(&self) -> UptimeUriBuilder {
UptimeUriBuilder::from_parent(&Arc::new(self))
}
pub fn values(&self, pref: &str) -> ValuesUriBuilder {
ValuesUriBuilder::from_parent(&Arc::new(self))
.with_preferences(pref)
}
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/config")]
#[match_path(path = "{parent}/config/{tool_id}")]
#[match_path(path = "{parent}/config/{tool_id}/{file_path}")]
pub struct SiteConfigUriBuilderLegacy<Parent>
where
Parent: AdminUriBuilder,
{
#[param]
file_path: Option<String>,
#[param]
tool_id: Option<String>,
#[parent]
parent: Option<Arc<Parent>>
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/prefs")]
pub struct PreferenceUriBuilder<Parent>
where
Parent: AdminUriBuilder,
{
#[parent]
parent: Option<Arc<Parent>>,
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/ini")]
#[match_path(path = "{parent}/ini/{tool_id}")]
pub struct IniUriBuilder<'a>
{
#[param]
tool_id: Option<String>,
#[parent]
parent: Option<&'a PreferenceUriBuilder<String>>
}
#[derive(Debug, Default, Clone, UriBuilder)]
#[match_path(path = "{parent}/props")]
#[match_path(path = "{parent}/props/{tool_id}")]
pub struct PropsUriBuilder<'a>
{
#[param]
tool_id: Option<String>,
#[parent]
parent: Option<&'a PreferenceUriBuilder<String>>
}
impl PreferenceUriBuilder<String>
{
pub fn ini(&self) -> IniUriBuilder {
IniUriBuilder::from_parent(&Arc::new(self))
}
pub fn properties(&self) -> PropsUriBuilder {
PropsUriBuilder::from_parent(&Arc::new(self))
}
}
pub trait AdminUri: Version {
#[inline]
fn site_config(&self) -> SiteConfigUriBuilder<String> {
SiteConfigUriBuilder::from_parent(self.root_uri().into())
}
#[inline]
fn preferences(&self) -> PreferenceUriBuilder<String> {
PreferenceUriBuilder::from_parent(self.root_uri().into())
}
#[inline]
fn schema(&self) -> SchemaUriBuilder<String> {
SchemaUriBuilder::from_parent(self.root_uri().into())
}
}
pub trait AdminUriLegacy: Version {
#[inline]
fn config(&self) -> SiteConfigUriBuilderLegacy<String> {
SiteConfigUriBuilderLegacy::from_parent(self.data_uri().into())
}
}