#![allow(missing_docs)]
use serde::{de, Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct Dependabot {
#[serde(deserialize_with = "de_version")]
version: u8,
pub update_configs: Vec<UpdateConfig>,
}
impl Dependabot {
pub fn new(update_configs: Vec<UpdateConfig>) -> Self {
Self { version: 1, update_configs }
}
}
impl Default for Dependabot {
fn default() -> Self {
Self::new(vec![])
}
}
impl ToString for Dependabot {
fn to_string(&self) -> String {
serde_yaml::to_string(&self).unwrap()
}
}
#[allow(single_use_lifetimes)]
fn de_version<'de, D>(deserializer: D) -> Result<u8, D::Error>
where
D: de::Deserializer<'de>,
{
let n: u8 = Deserialize::deserialize(deserializer)?;
match n {
1 => Ok(n),
_ => Err(de::Error::custom(format!(
"The property 'version' value \"{}\" did not match: 1",
n
))),
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct UpdateConfig {
pub package_manager: PackageManager,
pub directory: String,
pub update_schedule: UpdateSchedule,
#[serde(skip_serializing_if = "Option::is_none")]
pub target_branch: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_reviewers: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_assignees: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_labels: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_milestone: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_updates: Option<Vec<AllowedUpdate>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignored_updates: Option<Vec<IgnoredUpdate>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub automerged_updates: Option<Vec<AutomergedUpdate>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version_requirement_updates: Option<VersionRequirementUpdate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub commit_message: Option<CommitMessage>,
}
impl UpdateConfig {
pub fn new(
package_manager: PackageManager,
directory: impl Into<String>,
update_schedule: UpdateSchedule,
) -> Self {
Self {
package_manager,
directory: directory.into(),
update_schedule,
target_branch: None,
default_reviewers: None,
default_assignees: None,
default_labels: None,
default_milestone: None,
allowed_updates: None,
ignored_updates: None,
automerged_updates: None,
version_requirement_updates: None,
commit_message: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum PackageManager {
Javascript,
#[serde(rename = "ruby:bundler")]
RubyBundler,
#[serde(rename = "php:composer")]
PhpComposer,
Python,
#[serde(rename = "go:modules")]
GoModules,
#[serde(rename = "go:dep")]
GoDep,
#[serde(rename = "java:maven")]
JavaMaven,
#[serde(rename = "java:gradle")]
JavaGradle,
#[serde(rename = "dotnet:nuget")]
DotnetNuget,
#[serde(rename = "rust:cargo")]
RustCargo,
#[serde(rename = "elixir:hex")]
ElixirHex,
Docker,
Terraform,
Submodules,
Elm,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum UpdateSchedule {
Live,
Daily,
Weekly,
Monthly,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct AllowedUpdate {
#[serde(rename = "match")]
pub match_: AllowedUpdateMatch,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct AllowedUpdateMatch {
#[serde(skip_serializing_if = "Option::is_none")]
pub dependency_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dependency_type: Option<AllowedDependencyType>,
pub update_type: Option<AllowedUpdateType>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AllowedDependencyType {
Development,
Production,
Direct,
Indirect,
All,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AllowedUpdateType {
Security,
All,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct IgnoredUpdate {
#[serde(rename = "match")]
pub match_: IgnoredUpdateMatch,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct IgnoredUpdateMatch {
pub dependency_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version_requirement: Option<String>,
}
impl IgnoredUpdate {
pub fn new(dependency_name: String) -> Self {
Self { match_: IgnoredUpdateMatch { dependency_name, version_requirement: None } }
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct AutomergedUpdate {
#[serde(rename = "match")]
pub match_: AutomergedUpdateMatch,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct AutomergedUpdateMatch {
pub dependency_name: Option<String>,
pub dependency_type: Option<AutomergedDependencyType>,
pub update_type: Option<AutomergedUpdateType>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AutomergedDependencyType {
Development,
Production,
All,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AutomergedUpdateType {
#[serde(rename = "security:patch")]
SecurityPatch,
#[serde(rename = "semver:patch")]
SemverPatch,
#[serde(rename = "semver:minor")]
SemverMinor,
InRange,
All,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum VersionRequirementUpdate {
Off,
Auto,
WidenRanges,
IncreaseVersions,
IncreaseVersionsIfNecessary,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub struct CommitMessage {
#[serde(skip_serializing_if = "Option::is_none")]
pub prefix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prefix_development: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_scope: Option<bool>,
}