Rearrange the code a bit
I'm prepping to make bebot do more things than just be a gitlab webhook handler, so I've moved the gitlab stuff into its own module (and some of the matrix helper functions too, for good measure). The config file also now puts all the gitlab-specific configuration under a 'gitlab' key.
This commit is contained in:
110
src/config.rs
110
src/config.rs
@@ -14,14 +14,13 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
use std::{collections::HashMap, fmt, fs::File, io::BufReader};
|
||||
use std::{collections::HashMap, fs::File, io::BufReader};
|
||||
|
||||
use anyhow::Context;
|
||||
use matrix_sdk::ruma::{OwnedRoomOrAliasId, OwnedUserId, RoomOrAliasId, UserId};
|
||||
use matrix_sdk::ruma::{OwnedRoomOrAliasId, OwnedUserId};
|
||||
use regex::Regex;
|
||||
use serde::de;
|
||||
|
||||
use crate::event::{IssueAction, MergeRequestAction, PipelineStatus};
|
||||
use crate::gitlab_event::{IssueAction, MergeRequestAction, PipelineStatus};
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[serde(tag = "name", rename_all = "snake_case")]
|
||||
@@ -47,111 +46,30 @@ pub enum PublishEvent {
|
||||
pub struct RepoConfig {
|
||||
pub token: String,
|
||||
#[serde(default)]
|
||||
#[serde(deserialize_with = "deser_optional_room_or_alias_id")]
|
||||
#[serde(deserialize_with = "crate::matrix::deser_optional_room_or_alias_id")]
|
||||
pub room: Option<OwnedRoomOrAliasId>,
|
||||
pub publish_events: Option<Vec<PublishEvent>>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub struct Config {
|
||||
pub bind_address: Option<String>,
|
||||
pub bind_port: Option<u16>,
|
||||
pub struct GitlabConfig {
|
||||
pub url_prefix: Option<String>,
|
||||
#[serde(deserialize_with = "deser_user_id")]
|
||||
pub user_id: OwnedUserId,
|
||||
pub password: String,
|
||||
#[serde(default)]
|
||||
#[serde(deserialize_with = "deser_optional_room_or_alias_id")]
|
||||
#[serde(deserialize_with = "crate::matrix::deser_optional_room_or_alias_id")]
|
||||
pub default_room: Option<OwnedRoomOrAliasId>,
|
||||
pub default_publish_events: Option<Vec<PublishEvent>>,
|
||||
pub repo_configs: HashMap<String, RepoConfig>, // key is repo url without scheme; e.g.
|
||||
// gitlab.xfce.org/xfce/xfdesktop
|
||||
}
|
||||
|
||||
fn deser_user_id<'de, D>(deserializer: D) -> Result<OwnedUserId, D::Error>
|
||||
where
|
||||
D: de::Deserializer<'de>,
|
||||
{
|
||||
struct UserIdVisitor;
|
||||
|
||||
impl<'de> de::Visitor<'de> for UserIdVisitor {
|
||||
type Value = OwnedUserId;
|
||||
|
||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
formatter.write_str("a matrix user ID")
|
||||
}
|
||||
|
||||
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
UserId::parse(v).map_err(E::custom)
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_any(UserIdVisitor)
|
||||
}
|
||||
|
||||
fn deser_room_or_alias_id<'de, D>(deserializer: D) -> Result<OwnedRoomOrAliasId, D::Error>
|
||||
where
|
||||
D: de::Deserializer<'de>,
|
||||
{
|
||||
struct RoomOrAliasIdVisitor;
|
||||
|
||||
impl<'de> de::Visitor<'de> for RoomOrAliasIdVisitor {
|
||||
type Value = OwnedRoomOrAliasId;
|
||||
|
||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
formatter.write_str("a matrix room ID")
|
||||
}
|
||||
|
||||
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
RoomOrAliasId::parse(v).map_err(E::custom)
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_any(RoomOrAliasIdVisitor)
|
||||
}
|
||||
|
||||
fn deser_optional_room_or_alias_id<'de, D>(deserializer: D) -> Result<Option<OwnedRoomOrAliasId>, D::Error>
|
||||
where
|
||||
D: de::Deserializer<'de>,
|
||||
{
|
||||
struct OptionalRoomOrAliasIdVisitor;
|
||||
|
||||
impl<'de> de::Visitor<'de> for OptionalRoomOrAliasIdVisitor {
|
||||
type Value = Option<OwnedRoomOrAliasId>;
|
||||
|
||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||
formatter.write_str("null or matrix room ID")
|
||||
}
|
||||
|
||||
fn visit_none<E>(self) -> Result<Self::Value, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
Ok(Some(deser_room_or_alias_id(deserializer)?))
|
||||
}
|
||||
|
||||
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
||||
where
|
||||
E: de::Error,
|
||||
{
|
||||
RoomOrAliasId::parse(v).map(Some).map_err(E::custom)
|
||||
}
|
||||
}
|
||||
|
||||
deserializer.deserialize_any(OptionalRoomOrAliasIdVisitor)
|
||||
#[derive(Deserialize)]
|
||||
pub struct Config {
|
||||
pub bind_address: Option<String>,
|
||||
pub bind_port: Option<u16>,
|
||||
#[serde(deserialize_with = "crate::matrix::deser_user_id")]
|
||||
pub user_id: OwnedUserId,
|
||||
pub password: String,
|
||||
pub gitlab: GitlabConfig,
|
||||
}
|
||||
|
||||
fn load_blocking(path: &String) -> anyhow::Result<Config> {
|
||||
|
Reference in New Issue
Block a user