1
0
Fork 0

feat: naive implementation of ssh_url deserialization

This commit is contained in:
aviac 2024-05-10 09:00:27 +02:00
parent 1c5506c707
commit 9b2864bd70
No known key found for this signature in database
GPG key ID: 644781002BDEA982
3 changed files with 41 additions and 5 deletions

View file

@ -2278,7 +2278,8 @@ pub struct Repository {
pub release_counter: Option<u64>,
pub repo_transfer: Option<RepoTransfer>,
pub size: Option<u64>,
pub ssh_url: Option<String>,
#[serde(deserialize_with = "crate::deserialize_optional_ssh_url")]
pub ssh_url: Option<url::Url>,
pub stars_count: Option<u64>,
pub template: Option<bool>,
#[serde(with = "time::serde::rfc3339::option")]

View file

@ -1,4 +1,5 @@
use reqwest::{Client, Request, StatusCode};
use serde::{Deserialize, Deserializer};
use soft_assert::*;
use url::Url;
use zeroize::Zeroize;
@ -254,6 +255,31 @@ fn none_if_blank_url<'de, D: serde::Deserializer<'de>>(
deserializer.deserialize_str(EmptyUrlVisitor)
}
#[allow(dead_code)] // not used yet, but it might appear in the future
fn deserialize_ssh_url<'de, D, DE>(deserializer: D) -> Result<Url, DE>
where
D: Deserializer<'de>,
DE: serde::de::Error,
{
let raw_url: String = String::deserialize(deserializer).map_err(DE::custom)?;
let url = format!("ssh://{url}", url = raw_url.replace(":", "/"));
Url::parse(url.as_str()).map_err(DE::custom)
}
fn deserialize_optional_ssh_url<'de, D, DE>(deserializer: D) -> Result<Option<Url>, DE>
where
D: Deserializer<'de>,
DE: serde::de::Error,
{
let raw_url: Option<String> = Option::deserialize(deserializer).map_err(DE::custom)?;
raw_url
.map(|raw_url| {
let url = format!("ssh://{url}", url = raw_url.replace(":", "/"));
Url::parse(url.as_str()).map_err(DE::custom).map(Some)
})
.unwrap_or(Ok(None))
}
impl From<structs::DefaultMergeStyle> for structs::MergePullRequestOptionDo {
fn from(value: structs::DefaultMergeStyle) -> Self {
match value {