use crate::pagination::{ListOptions, QueryEncode};
use crate::{Deserialize, Serialize};
#[derive(Debug, Clone, Default)]
pub struct ListRepoTagsOptions {
pub list_options: ListOptions,
}
impl QueryEncode for ListRepoTagsOptions {
fn query_encode(&self) -> String {
self.list_options.query_encode()
}
}
#[derive(Debug, Clone, Default)]
pub struct ListRepoTagProtectionsOptions {
pub list_options: ListOptions,
}
impl QueryEncode for ListRepoTagProtectionsOptions {
fn query_encode(&self) -> String {
self.list_options.query_encode()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateTagOption {
#[serde(rename = "tag_name")]
pub tag_name: String,
pub message: String,
pub target: String,
}
impl CreateTagOption {
pub fn validate(&self) -> crate::Result<()> {
if self.tag_name.is_empty() {
return Err(crate::Error::Validation("TagName is required".to_string()));
}
Ok(())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateTagProtectionOption {
#[serde(rename = "name_pattern")]
pub name_pattern: String,
#[serde(default)]
pub whitelist_usernames: Vec<String>,
#[serde(default)]
pub whitelist_teams: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EditTagProtectionOption {
#[serde(
rename = "name_pattern",
default,
skip_serializing_if = "Option::is_none"
)]
pub name_pattern: Option<String>,
#[serde(default)]
pub whitelist_usernames: Vec<String>,
#[serde(default)]
pub whitelist_teams: Vec<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_tag_option_validate_success() {
let opt = CreateTagOption {
tag_name: "v1.0".to_string(),
message: String::new(),
target: String::new(),
};
assert!(opt.validate().is_ok());
}
#[test]
fn test_create_tag_option_validate_empty_tag_name() {
let opt = CreateTagOption {
tag_name: String::new(),
message: String::new(),
target: String::new(),
};
assert!(opt.validate().is_err());
}
}