reactive_graph_net_git/behaviour/component/
repository.rs

1use reactive_graph_behaviour_model_api::behaviour_validator;
2use reactive_graph_behaviour_model_api::prelude::*;
3use reactive_graph_behaviour_model_impl::entity_behaviour;
4use reactive_graph_graph::prelude::*;
5use reactive_graph_reactive_model_impl::ReactiveEntity;
6use serde_json::Value;
7use uuid::Uuid;
8
9use reactive_graph_net_git_model::RepositoryProperties::FAST_FORWARD;
10
11use reactive_graph_net_git_model::GitRepository;
12use reactive_graph_net_git_model::RepositoryProperties::BRANCH;
13use reactive_graph_net_git_model::RepositoryProperties::FETCH;
14use reactive_graph_net_git_model::RepositoryProperties::REMOTE_BRANCH;
15use reactive_graph_net_git_model::RepositoryProperties::REMOTE_NAME;
16use reactive_graph_net_http_model::UrlProperties::URL;
17use reactive_graph_runtime_model::ActionProperties::TRIGGER;
18use reactive_graph_sys_file_model::FileProperties::FILENAME;
19
20entity_behaviour!(Repository, RepositoryFactory, RepositoryFsm, RepositoryBehaviourTransitions, RepositoryValidator);
21
22behaviour_validator!(
23    RepositoryValidator,
24    Uuid,
25    ReactiveEntity,
26    TRIGGER.as_ref(),
27    URL.as_ref(),
28    FILENAME.as_ref(),
29    BRANCH.as_ref(),
30    REMOTE_BRANCH.as_ref(),
31    REMOTE_NAME.as_ref(),
32    TRIGGER.as_ref()
33);
34
35impl BehaviourInit<Uuid, ReactiveEntity> for RepositoryBehaviourTransitions {
36    fn init(&self) -> Result<(), BehaviourInitializationFailed> {
37        let repository = reactive_graph_net_git_model::Repository::from(self.reactive_instance.clone());
38        if repository.as_bool(TRIGGER).unwrap_or(false) {
39            if repository.exists() {
40                repository.git_fetch_and_fast_forward();
41            } else {
42                repository.git_clone();
43            }
44        }
45        Ok(())
46    }
47}
48
49impl BehaviourConnect<Uuid, ReactiveEntity> for RepositoryBehaviourTransitions {
50    fn connect(&self) -> Result<(), BehaviourConnectFailed> {
51        let reactive_instance = self.reactive_instance.clone();
52        self.property_observers.observe_with_handle(TRIGGER.as_ref(), move |trigger: &Value| {
53            if !trigger.as_bool().unwrap_or(false) {
54                return;
55            }
56            let repository = reactive_graph_net_git_model::Repository::from(reactive_instance.clone());
57            if repository.exists() {
58                repository.git_fetch_and_fast_forward();
59            } else {
60                repository.git_clone();
61            }
62        });
63        let reactive_instance = self.reactive_instance.clone();
64        self.property_observers.observe_with_handle(FETCH.as_ref(), move |fetch: &Value| {
65            if !fetch.as_bool().unwrap_or(false) {
66                return;
67            }
68            let repository = reactive_graph_net_git_model::Repository::from(reactive_instance.clone());
69            if repository.exists() {
70                repository.git_fetch();
71            }
72        });
73        let reactive_instance = self.reactive_instance.clone();
74        self.property_observers.observe_with_handle(FAST_FORWARD.as_ref(), move |fast_forward: &Value| {
75            if !fast_forward.as_bool().unwrap_or(false) {
76                return;
77            }
78            let repository = reactive_graph_net_git_model::Repository::from(reactive_instance.clone());
79            if repository.exists() {
80                repository.git_fast_forward();
81            }
82        });
83        let reactive_instance = self.reactive_instance.clone();
84        self.property_observers.observe_with_handle(BRANCH.as_ref(), move |branch: &Value| {
85            if let Some(branch) = branch.as_str().map(str::to_string) {
86                let repository = reactive_graph_net_git_model::Repository::from(reactive_instance.clone());
87                if repository.exists() {
88                    repository.git_checkout(branch);
89                }
90            }
91        });
92        Ok(())
93    }
94}
95
96impl BehaviourShutdown<Uuid, ReactiveEntity> for RepositoryBehaviourTransitions {}
97impl BehaviourTransitions<Uuid, ReactiveEntity> for RepositoryBehaviourTransitions {}