use crate::types::BaseUrl;
pub enum Endpoint {
Login,
LoginWithToken,
Logout,
LogoutToken,
LogoutUser,
LogoutAll,
MetaCounts,
MetaDb,
MetaTasks,
Users,
UsersById,
UserGroups,
UserTokens,
Groups,
GroupsById,
GroupMembers,
GroupMembersAddRemove,
Classes,
ClassesById,
ClassPermissions,
ClassRelatedClasses,
ClassRelatedRelations,
ClassRelatedGraph,
ClassRelationsFromClass,
ClassRelationFromClassById,
Namespaces,
NamespacesById,
NamespacePermissions,
NamespacePermissionsGrant,
NamespacePermissionGrant,
NamespaceUserPermissions,
NamespaceHasPermissions,
Objects,
ObjectsById,
ObjectRelatedObjects,
ObjectRelatedRelations,
ObjectRelatedGraph,
ObjectScopedRelationById,
ClassRelations,
ClassRelationsById,
ObjectRelations,
ObjectRelationsById,
Search,
SearchStream,
ReportTemplates,
ReportTemplatesById,
Reports,
TasksById,
TaskEvents,
Imports,
ImportById,
ImportResults,
}
impl Endpoint {
pub fn path(&self) -> &'static str {
match self {
Endpoint::Login => "/api/v0/auth/login",
Endpoint::LoginWithToken => "/api/v0/auth/validate",
Endpoint::Logout => "/api/v0/auth/logout",
Endpoint::LogoutToken => "/api/v0/auth/logout/token/{token}",
Endpoint::LogoutUser => "/api/v0/auth/logout/uid/{user_id}",
Endpoint::LogoutAll => "/api/v0/auth/logout_all",
Endpoint::MetaCounts => "/api/v0/meta/counts",
Endpoint::MetaDb => "/api/v0/meta/db",
Endpoint::MetaTasks => "/api/v0/meta/tasks",
Endpoint::Users => "/api/v1/iam/users",
Endpoint::UsersById => "/api/v1/iam/users/{user_id}",
Endpoint::UserGroups => "/api/v1/iam/users/{user_id}/groups",
Endpoint::UserTokens => "/api/v1/iam/users/{user_id}/tokens",
Endpoint::Groups => "/api/v1/iam/groups",
Endpoint::GroupsById => "/api/v1/iam/groups/{group_id}",
Endpoint::GroupMembers => "/api/v1/iam/groups/{group_id}/members",
Endpoint::GroupMembersAddRemove => "/api/v1/iam/groups/{group_id}/members/{user_id}",
Endpoint::Classes => "/api/v1/classes",
Endpoint::ClassesById => "/api/v1/classes/{class_id}",
Endpoint::ClassPermissions => "/api/v1/classes/{class_id}/permissions",
Endpoint::ClassRelatedClasses => "/api/v1/classes/{class_id}/related/classes",
Endpoint::ClassRelatedRelations => "/api/v1/classes/{class_id}/related/relations",
Endpoint::ClassRelatedGraph => "/api/v1/classes/{class_id}/related/graph",
Endpoint::ClassRelationsFromClass => "/api/v1/classes/{class_id}/relations",
Endpoint::ClassRelationFromClassById => {
"/api/v1/classes/{class_id}/relations/{relation_id}"
}
Endpoint::Namespaces => "/api/v1/namespaces",
Endpoint::NamespacesById => "/api/v1/namespaces/{namespace_id}",
Endpoint::NamespacePermissions => "/api/v1/namespaces/{namespace_id}/permissions",
Endpoint::NamespacePermissionsGrant => {
"/api/v1/namespaces/{namespace_id}/permissions/group/{group_id}"
}
Endpoint::NamespacePermissionGrant => {
"/api/v1/namespaces/{namespace_id}/permissions/group/{group_id}/{permission}"
}
Endpoint::NamespaceUserPermissions => {
"/api/v1/namespaces/{namespace_id}/permissions/user/{user_id}"
}
Endpoint::NamespaceHasPermissions => {
"/api/v1/namespaces/{namespace_id}/has_permissions/{permission}"
}
Endpoint::Objects => "/api/v1/classes/{class_id}/",
Endpoint::ObjectsById => "/api/v1/classes/{class_id}/{object_id}",
Endpoint::ObjectRelatedObjects => {
"/api/v1/classes/{class_id}/objects/{object_id}/related/objects"
}
Endpoint::ObjectRelatedRelations => {
"/api/v1/classes/{class_id}/objects/{object_id}/related/relations"
}
Endpoint::ObjectRelatedGraph => {
"/api/v1/classes/{class_id}/objects/{object_id}/related/graph"
}
Endpoint::ObjectScopedRelationById => {
"/api/v1/classes/{class_id}/{from_object_id}/relations/{to_class_id}/{to_object_id}"
}
Endpoint::ClassRelations => "/api/v1/relations/classes",
Endpoint::ClassRelationsById => "/api/v1/relations/classes/{relation_id}",
Endpoint::ObjectRelations => "/api/v1/relations/objects",
Endpoint::ObjectRelationsById => "/api/v1/relations/objects/{relation_id}",
Endpoint::Search => "/api/v1/search",
Endpoint::SearchStream => "/api/v1/search/stream",
Endpoint::ReportTemplates => "/api/v1/templates",
Endpoint::ReportTemplatesById => "/api/v1/templates/{template_id}",
Endpoint::Reports => "/api/v1/reports",
Endpoint::TasksById => "/api/v1/tasks/{task_id}",
Endpoint::TaskEvents => "/api/v1/tasks/{task_id}/events",
Endpoint::Imports => "/api/v1/imports",
Endpoint::ImportById => "/api/v1/imports/{task_id}",
Endpoint::ImportResults => "/api/v1/imports/{task_id}/results",
}
}
pub fn complete(&self, baseurl: &BaseUrl) -> String {
format!(
"{}{}",
baseurl.with_trailing_slash(),
self.trim_start_matches('/')
)
}
pub fn trim_start_matches(&self, prefix: char) -> &str {
self.path().trim_start_matches(prefix)
}
}
#[cfg(test)]
mod test {
use super::*;
use std::str::FromStr;
use yare::parameterized;
#[parameterized(
login = { Endpoint::Login, "/api/v0/auth/login" },
logout = { Endpoint::Logout, "/api/v0/auth/logout" },
logout_token = { Endpoint::LogoutToken, "/api/v0/auth/logout/token/{token}" },
logout_user = { Endpoint::LogoutUser, "/api/v0/auth/logout/uid/{user_id}" },
logout_all = { Endpoint::LogoutAll, "/api/v0/auth/logout_all" },
meta_counts = { Endpoint::MetaCounts, "/api/v0/meta/counts" },
meta_db = { Endpoint::MetaDb, "/api/v0/meta/db" },
meta_tasks = { Endpoint::MetaTasks, "/api/v0/meta/tasks" },
get_user = { Endpoint::Users, "/api/v1/iam/users" },
get_user_by_id = { Endpoint::UsersById, "/api/v1/iam/users/{user_id}" },
get_user_groups = { Endpoint::UserGroups, "/api/v1/iam/users/{user_id}/groups" },
get_user_tokens = { Endpoint::UserTokens, "/api/v1/iam/users/{user_id}/tokens" },
get_group_by_id = { Endpoint::GroupsById, "/api/v1/iam/groups/{group_id}" },
get_class_permissions = { Endpoint::ClassPermissions, "/api/v1/classes/{class_id}/permissions" },
get_class_by_id = { Endpoint::ClassesById, "/api/v1/classes/{class_id}" },
get_class_related_classes = { Endpoint::ClassRelatedClasses, "/api/v1/classes/{class_id}/related/classes" },
get_class_related_relations = { Endpoint::ClassRelatedRelations, "/api/v1/classes/{class_id}/related/relations" },
get_class_related_graph = { Endpoint::ClassRelatedGraph, "/api/v1/classes/{class_id}/related/graph" },
class_relations_from_class = { Endpoint::ClassRelationsFromClass, "/api/v1/classes/{class_id}/relations" },
class_relation_from_class_by_id = { Endpoint::ClassRelationFromClassById, "/api/v1/classes/{class_id}/relations/{relation_id}" },
get_namespace_by_id = { Endpoint::NamespacesById, "/api/v1/namespaces/{namespace_id}" },
get_namespace_permission_grant = { Endpoint::NamespacePermissionsGrant, "/api/v1/namespaces/{namespace_id}/permissions/group/{group_id}" },
get_namespace_single_permission_grant = { Endpoint::NamespacePermissionGrant, "/api/v1/namespaces/{namespace_id}/permissions/group/{group_id}/{permission}" },
get_namespace_user_permissions = { Endpoint::NamespaceUserPermissions, "/api/v1/namespaces/{namespace_id}/permissions/user/{user_id}" },
get_namespace_has_permissions = { Endpoint::NamespaceHasPermissions, "/api/v1/namespaces/{namespace_id}/has_permissions/{permission}" },
get_class = { Endpoint::Classes, "/api/v1/classes" },
get_object_by_id = { Endpoint::ObjectsById, "/api/v1/classes/{class_id}/{object_id}" },
get_object_related_objects = { Endpoint::ObjectRelatedObjects, "/api/v1/classes/{class_id}/objects/{object_id}/related/objects" },
get_object_related_relations = { Endpoint::ObjectRelatedRelations, "/api/v1/classes/{class_id}/objects/{object_id}/related/relations" },
get_object_related_graph = { Endpoint::ObjectRelatedGraph, "/api/v1/classes/{class_id}/objects/{object_id}/related/graph" },
get_object_scoped_relation_by_id = { Endpoint::ObjectScopedRelationById, "/api/v1/classes/{class_id}/{from_object_id}/relations/{to_class_id}/{to_object_id}" },
class_relation_by_id = { Endpoint::ClassRelationsById, "/api/v1/relations/classes/{relation_id}" },
object_relation_by_id = { Endpoint::ObjectRelationsById, "/api/v1/relations/objects/{relation_id}" },
search = { Endpoint::Search, "/api/v1/search" },
search_stream = { Endpoint::SearchStream, "/api/v1/search/stream" },
templates = { Endpoint::ReportTemplates, "/api/v1/templates" },
template_by_id = { Endpoint::ReportTemplatesById, "/api/v1/templates/{template_id}" },
reports = { Endpoint::Reports, "/api/v1/reports" },
task_by_id = { Endpoint::TasksById, "/api/v1/tasks/{task_id}" },
task_events = { Endpoint::TaskEvents, "/api/v1/tasks/{task_id}/events" },
imports = { Endpoint::Imports, "/api/v1/imports" },
import_by_id = { Endpoint::ImportById, "/api/v1/imports/{task_id}" },
import_results = { Endpoint::ImportResults, "/api/v1/imports/{task_id}/results" }
)]
fn test_endpoint_path(endpoint: Endpoint, expected: &str) {
assert_eq!(endpoint.path(), expected);
}
#[parameterized(
login = { Endpoint::Login, '/', "api/v0/auth/login" },
logout = { Endpoint::Logout, '/', "api/v0/auth/logout" },
logout_token = { Endpoint::LogoutToken, '/', "api/v0/auth/logout/token/{token}" },
logout_user = { Endpoint::LogoutUser, '/', "api/v0/auth/logout/uid/{user_id}" },
logout_all = { Endpoint::LogoutAll, '/', "api/v0/auth/logout_all" },
meta_counts = { Endpoint::MetaCounts, '/', "api/v0/meta/counts" },
meta_db = { Endpoint::MetaDb, '/', "api/v0/meta/db" },
meta_tasks = { Endpoint::MetaTasks, '/', "api/v0/meta/tasks" },
get_user = { Endpoint::Users, '/', "api/v1/iam/users" },
get_user_by_id = { Endpoint::UsersById, '/', "api/v1/iam/users/{user_id}" },
get_user_groups = { Endpoint::UserGroups, '/', "api/v1/iam/users/{user_id}/groups" },
get_user_tokens = { Endpoint::UserTokens, '/', "api/v1/iam/users/{user_id}/tokens" },
get_group_by_id = { Endpoint::GroupsById, '/', "api/v1/iam/groups/{group_id}" },
get_class_permissions = { Endpoint::ClassPermissions, '/', "api/v1/classes/{class_id}/permissions" },
get_class_by_id = { Endpoint::ClassesById, '/', "api/v1/classes/{class_id}" },
get_class_related_classes = { Endpoint::ClassRelatedClasses, '/', "api/v1/classes/{class_id}/related/classes" },
get_class_related_relations = { Endpoint::ClassRelatedRelations, '/', "api/v1/classes/{class_id}/related/relations" },
get_class_related_graph = { Endpoint::ClassRelatedGraph, '/', "api/v1/classes/{class_id}/related/graph" },
class_relations_from_class = { Endpoint::ClassRelationsFromClass, '/', "api/v1/classes/{class_id}/relations" },
class_relation_from_class_by_id = { Endpoint::ClassRelationFromClassById, '/', "api/v1/classes/{class_id}/relations/{relation_id}" },
get_namespace_by_id = { Endpoint::NamespacesById, '/', "api/v1/namespaces/{namespace_id}" },
get_namespace_permission_grant = { Endpoint::NamespacePermissionsGrant, '/', "api/v1/namespaces/{namespace_id}/permissions/group/{group_id}" },
get_namespace_single_permission_grant = { Endpoint::NamespacePermissionGrant, '/', "api/v1/namespaces/{namespace_id}/permissions/group/{group_id}/{permission}" },
get_namespace_user_permissions = { Endpoint::NamespaceUserPermissions, '/', "api/v1/namespaces/{namespace_id}/permissions/user/{user_id}" },
get_namespace_has_permissions = { Endpoint::NamespaceHasPermissions, '/', "api/v1/namespaces/{namespace_id}/has_permissions/{permission}" },
get_class = { Endpoint::Classes, '/', "api/v1/classes" },
get_object_by_id = { Endpoint::ObjectsById, '/', "api/v1/classes/{class_id}/{object_id}" },
get_object_related_objects = { Endpoint::ObjectRelatedObjects, '/', "api/v1/classes/{class_id}/objects/{object_id}/related/objects" },
get_object_related_relations = { Endpoint::ObjectRelatedRelations, '/', "api/v1/classes/{class_id}/objects/{object_id}/related/relations" },
get_object_related_graph = { Endpoint::ObjectRelatedGraph, '/', "api/v1/classes/{class_id}/objects/{object_id}/related/graph" },
get_object_scoped_relation_by_id = { Endpoint::ObjectScopedRelationById, '/', "api/v1/classes/{class_id}/{from_object_id}/relations/{to_class_id}/{to_object_id}" },
class_relation_by_id = { Endpoint::ClassRelationsById, '/', "api/v1/relations/classes/{relation_id}" },
object_relation_by_id = { Endpoint::ObjectRelationsById, '/', "api/v1/relations/objects/{relation_id}" },
search = { Endpoint::Search, '/', "api/v1/search" },
search_stream = { Endpoint::SearchStream, '/', "api/v1/search/stream" },
templates = { Endpoint::ReportTemplates, '/', "api/v1/templates" },
template_by_id = { Endpoint::ReportTemplatesById, '/', "api/v1/templates/{template_id}" },
reports = { Endpoint::Reports, '/', "api/v1/reports" },
task_by_id = { Endpoint::TasksById, '/', "api/v1/tasks/{task_id}" },
task_events = { Endpoint::TaskEvents, '/', "api/v1/tasks/{task_id}/events" },
imports = { Endpoint::Imports, '/', "api/v1/imports" },
import_by_id = { Endpoint::ImportById, '/', "api/v1/imports/{task_id}" },
import_results = { Endpoint::ImportResults, '/', "api/v1/imports/{task_id}/results" }
)]
fn test_trim_start_matches(endpoint: Endpoint, prefix: char, expected: &str) {
assert_eq!(endpoint.trim_start_matches(prefix), expected);
}
#[parameterized(
api_login = { Endpoint::Login, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v0/auth/login" },
api_logout = { Endpoint::Logout, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v0/auth/logout" },
api_logout_all = { Endpoint::LogoutAll, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v0/auth/logout_all" },
api_meta_counts = { Endpoint::MetaCounts, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v0/meta/counts" },
api_meta_db = { Endpoint::MetaDb, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v0/meta/db" },
api_meta_tasks = { Endpoint::MetaTasks, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v0/meta/tasks" },
api_get_user = { Endpoint::Users, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v1/iam/users" },
api_get_user_by_id = { Endpoint::UsersById, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v1/iam/users/{user_id}" },
api_get_group_by_id = { Endpoint::GroupsById, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v1/iam/groups/{group_id}" },
foo_login_with_token = { Endpoint::LoginWithToken, BaseUrl::from_str("https://foo.bar.com").unwrap(), "https://foo.bar.com/api/v0/auth/validate" },
api_search = { Endpoint::Search, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v1/search" },
api_reports = { Endpoint::Reports, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v1/reports" },
api_imports = { Endpoint::Imports, BaseUrl::from_str("https://api.example.com").unwrap(), "https://api.example.com/api/v1/imports" }
)]
fn test_complete(endpoint: Endpoint, baseurl: BaseUrl, expected: &str) {
assert_eq!(endpoint.complete(&baseurl), expected);
}
}