reactive_graph_net_git/behaviour/component/
repository.rs1use 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 {}