summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authoraviac <aviac@mailbox.org>2024-05-11 13:00:17 +0200
committeraviac <aviac@mailbox.org>2024-05-11 13:00:17 +0200
commita786cd85add0acb89c1f4b843f0af6b3f7ebc65a (patch)
tree3efff05e9ba3d3832884efe6d97d8f6a9749b4e9 /src/lib.rs
parenttest: add a small 🤏 cute 🥺 test to prove it works (diff)
downloadforgejo-api-a786cd85add0acb89c1f4b843f0af6b3f7ebc65a.tar.xz
forgejo-api-a786cd85add0acb89c1f4b843f0af6b3f7ebc65a.zip
fix: implement review comment regarding non standard ssh port scenario
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/lib.rs b/src/lib.rs
index c86ef64..2463d2c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -262,8 +262,7 @@ where
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)
+ parse_ssh_url(&raw_url).map_err(DE::custom)
}
fn deserialize_optional_ssh_url<'de, D, DE>(deserializer: D) -> Result<Option<Url>, DE>
@@ -273,13 +272,23 @@ where
{
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)
- })
+ .as_ref()
+ .map(parse_ssh_url)
+ .map(|res| res.map_err(DE::custom).map(Some))
.unwrap_or(Ok(None))
}
+fn parse_ssh_url(raw_url: &String) -> Result<Url, url::ParseError> {
+ // in case of a non-standard ssh-port (not 22), the ssh url coming from the forgejo API
+ // is actually parseable by the url crate, so try to do that first
+ Url::parse(raw_url).or_else(|_| {
+ // otherwise the ssh url is not parseable by the url crate and we try again after some
+ // pre-processing
+ let url = format!("ssh://{url}", url = raw_url.replace(":", "/"));
+ Url::parse(url.as_str())
+ })
+}
+
impl From<structs::DefaultMergeStyle> for structs::MergePullRequestOptionDo {
fn from(value: structs::DefaultMergeStyle) -> Self {
match value {