tag2upload_service_manager/
forge.rs1use crate::prelude::*;
13
14pub trait ForgeKind {
19 fn kind_name(&self) -> &'static str;
23}
24
25pub trait ForgeReceiver: ForgeKind + ForgeDataVersion + Default {
27 type Payload: for <'de> Deserialize<'de>;
28
29 fn prefilter_payload(&self, _payload: &serde_json::Value)
31 -> Result<(), WebError>
32 { Ok(()) }
33
34 fn analyse_payload(&self, payload: Self::Payload)
36 -> Result<webhook::AnalysedPayload<Self>, WebError>;
37}
38
39#[derive(Debug, Clone, Eq, PartialEq, Deftly, derive_more::Display)]
40#[derive_deftly(SqlViaString)]
41#[display("{kind_name}-{data_version}")]
42pub struct Namever {
43 pub kind_name: Cow<'static, str>,
44 pub data_version: u32,
45}
46ui_display_via_to_string!(Namever);
47
48#[async_trait]
52pub trait ForgeDataVersion: ForgeKind + Debug + Send + Sync + 'static {
53 type DbData: Display + FromStr<Err: Display> where Self: Sized;
54
55 fn data_version(&self) -> u32;
69
70 fn namever(&self) -> Namever {
72 Namever {
73 data_version: self.data_version(),
74 kind_name: self.kind_name().into(),
75 }
76 }
77
78 async fn make_progress(
88 &self,
89 host: &Hostname,
90 task_tmpdir: &str,
91 ) -> Result<(), QuitTask>;
92}
93
94#[derive(Error, Clone, Eq, PartialEq, Debug)]
95pub enum BadNamever {
96 #[error("missing `-` in {0:?}")]
97 NoHyphen(String),
98 #[error("bad version integer in {0:?}")]
99 BadNumber(String),
100}
101
102impl FromStr for Namever {
103 type Err = BadNamever;
104
105 fn from_str(s: &str) -> Result<Namever, Self::Err> {
106 let (kind_name, data_version) = s.rsplit_once('-')
107 .ok_or_else(|| BadNamever::NoHyphen(s.to_owned()))?;
108 let kind_name = kind_name.to_owned().into();
109 let data_version = data_version.parse()
110 .map_err(|_| BadNamever::BadNumber(s.to_owned()))?;
111 Ok(Namever { kind_name, data_version })
112 }
113}
114
115impl From<Namever> for String {
116 fn from(s: Namever) -> String {
117 s.to_string()
118 }
119}
120
121impl TryFrom<String> for Namever {
122 type Error = BadNamever;
123 fn try_from(s: String) -> Result<Namever, Self::Error> {
124 s.parse()
125 }
126}
127
128pub const FORGES: &[&dyn ForgeDataVersion] = &[
129 &gitlab::Forge1,
130 &gitlab::Forge2,
131];