worktree-io 0.17.6

A CLI tool to open GitHub issues as git worktree workspaces
Documentation
use anyhow::{bail, Context, Result};
use url::Url;

use crate::issue::IssueRef;

pub(super) fn parse_github_url(s: &str) -> Result<IssueRef> {
    let url = Url::parse(s).with_context(|| format!("Invalid URL: {s}"))?;

    let segments: Vec<&str> = url
        .path_segments()
        .context("URL has no path")?
        .filter(|s| !s.is_empty())
        .collect();

    if segments.len() < 4 || segments[2] != "issues" {
        bail!("Expected GitHub issue URL like https://github.com/owner/repo/issues/42, got: {s}");
    }

    let owner = segments[0].to_string();
    let repo = segments[1].to_string();
    let number = segments[3]
        .parse::<u64>()
        .with_context(|| format!("Invalid issue number in URL: {}", segments[3]))?;

    Ok(IssueRef::GitHub {
        owner,
        repo,
        number,
    })
}