From 63108e7341bcceaf37f9f7668e376a1dace039a7 Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Mon, 6 May 2024 22:28:21 +0530 Subject: [PATCH] feat+chore: factories to create forge adapters --- src/auth/adapter/out/forge/forge_factory.rs | 31 ++++++++ .../adapter/out/forge/forge_repository.rs | 71 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 src/auth/adapter/out/forge/forge_factory.rs create mode 100644 src/auth/adapter/out/forge/forge_repository.rs diff --git a/src/auth/adapter/out/forge/forge_factory.rs b/src/auth/adapter/out/forge/forge_factory.rs new file mode 100644 index 0000000..778efa9 --- /dev/null +++ b/src/auth/adapter/out/forge/forge_factory.rs @@ -0,0 +1,31 @@ +use std::sync::Arc; + +use mockall::predicate::*; +use mockall::*; + +use super::forgejo::Forgejo; +use crate::auth::application::port::out::forge::oauth_auth_req_uri::OAuthAuthReqUri; + +#[automock] +pub trait ForgeAdapterFactoryInterface: Send + Sync { + fn get_oauth_auth_req_uri_adapter(&self) -> Arc; +} + +#[derive(Clone)] +pub struct ForgeAdapterFactory { + forgejo: Arc, +} + +impl ForgeAdapterFactoryInterface for ForgeAdapterFactory { + fn get_oauth_auth_req_uri_adapter(&self) -> Arc { + self.forgejo.clone() + } +} + +impl ForgeAdapterFactory { + pub fn new(forgejo: Forgejo) -> Self { + Self { + forgejo: Arc::new(forgejo), + } + } +} diff --git a/src/auth/adapter/out/forge/forge_repository.rs b/src/auth/adapter/out/forge/forge_repository.rs new file mode 100644 index 0000000..09c030d --- /dev/null +++ b/src/auth/adapter/out/forge/forge_repository.rs @@ -0,0 +1,71 @@ +use std::collections::HashMap; +use std::sync::Arc; + +use mockall::predicate::*; +use mockall::*; + +use super::{ + forge_factory::ForgeAdapterFactory, forge_factory::ForgeAdapterFactoryInterface, + forgejo::Forgejo, SupportedForges, +}; + +#[automock] +pub trait ForgeRepositoryInterface: Send + Sync { + fn add_forge( + &mut self, + name: SupportedForges, + forge_factory: Arc, + ); + + fn get_supported_forge_str(&self) -> Vec; + + fn get_supported_forges(&self) -> Vec; + + fn get_forge_factory( + &self, + name: &SupportedForges, + ) -> Option>; +} + +#[derive(Clone, Default)] +pub struct ForgeRepository { + forges: HashMap>, +} + +impl ForgeRepositoryInterface for ForgeRepository { + fn add_forge( + &mut self, + name: SupportedForges, + forge_factory: Arc, + ) { + self.forges.insert(name, forge_factory); + } + + fn get_supported_forge_str(&self) -> Vec { + self.forges + .clone() + .into_keys() + .map(|v| v.to_string()) + .collect() + } + + fn get_supported_forges(&self) -> Vec { + self.forges.clone().into_keys().collect() + } + + fn get_forge_factory( + &self, + name: &SupportedForges, + ) -> Option> { + self.forges.get(name).cloned() + } +} + +impl ForgeRepository { + pub fn new(forgejo: Forgejo) -> Self { + let forgejo_adapter = ForgeAdapterFactory::new(forgejo); + let mut s = Self::default(); + s.add_forge(SupportedForges::Forgejo, Arc::new(forgejo_adapter)); + s + } +}