Skip to content

Commit

Permalink
Check name and also check specifically for GitHub
Browse files Browse the repository at this point in the history
  • Loading branch information
ja-he committed Jan 21, 2024
1 parent 8b0fc0b commit 9b07dc8
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 1 deletion.
36 changes: 35 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,29 @@ fn MainContent() -> impl IntoView {
}
});

let eval_name = move || purl_eval::eval_purl_name(name(), namespace(), typex());
let (eval_name_result, set_eval_name_result) = create_signal("verified".to_string());
let (eval_name_result_explanation, set_eval_name_result_explanation) =
create_signal("well-known identifier".to_string());
create_effect(move |_| {
let new = eval_name().summary();
let old = eval_name_result();
if old != new {
set_eval_name_result(new);
}
let new = eval_name().explanation();
let old = eval_name_result_explanation();
if old != new {
set_eval_name_result_explanation(new);
}
});

let get_type_explanation_box_class =
move || format!("explanation-box {result}", result = eval_type_result());
let get_namespace_explanation_box_class =
move || format!("explanation-box {result}", result = eval_namespace_result());
let get_name_explanation_box_class =
move || format!("explanation-box {result}", result = eval_name_result());

view! {
<div id="input-form">
Expand Down Expand Up @@ -222,6 +241,7 @@ fn MainContent() -> impl IntoView {
namespace={namespace}
eval_namespace_result={eval_namespace_result}
name={name}
eval_name_result={eval_name_result}
version={version}
qualifiers={qualifiers}
subpath={subpath}
Expand Down Expand Up @@ -250,6 +270,17 @@ fn MainContent() -> impl IntoView {
<span class="headline">{eval_namespace_result}</span>
<span class="explanation">{eval_namespace_result_explanation}</span>
</div>
<div class={get_name_explanation_box_class}>
{move || match eval_name_result().as_str() {
"verified" => view!{<phosphor_leptos::Checks class="explanation-icon verified" weight=phosphor_leptos::IconWeight::Bold />},
"ok" => view!{<phosphor_leptos::Check class="explanation-icon ok" weight=phosphor_leptos::IconWeight::Bold />} ,
"valid" => view!{<phosphor_leptos::Question class="explanation-icon valid" weight=phosphor_leptos::IconWeight::Bold />} ,
"invalid" => view!{<phosphor_leptos::Warning class="explanation-icon invalid" weight=phosphor_leptos::IconWeight::Bold />},
_ => view!{<phosphor_leptos::Warning class="explanation-icon error" weight=phosphor_leptos::IconWeight::Duotone />},
}}
<span class="headline">{eval_name_result}</span>
<span class="explanation">{eval_name_result_explanation}</span>
</div>
</div>
}
}
Expand All @@ -275,6 +306,7 @@ fn Purl(
namespace: ReadSignal<Vec<String>>,
eval_namespace_result: ReadSignal<String>,
name: ReadSignal<String>,
eval_name_result: ReadSignal<String>,
version: ReadSignal<Option<String>>,
qualifiers: ReadSignal<Option<String>>,
subpath: ReadSignal<Option<String>>,
Expand All @@ -287,6 +319,8 @@ fn Purl(
result = eval_namespace_result()
)
};
let get_purl_name_classes =
move || format!("purl-name identifier-{result}", result = eval_name_result());

let namespace_and_leading_slash = move || {
let namespace_view = move || {
Expand Down Expand Up @@ -317,7 +351,7 @@ fn Purl(
<span class=get_purl_type_classes>{move || typex.with(purl_data::PurlType::to_string)}</span>
{namespace_and_leading_slash}
<span class="purl-sep">/</span>
<span class="purl-name">{name}</span>
<span class=get_purl_name_classes>{name}</span>
{ move || {
version.get().is_some().then(|| {
view! {
Expand Down
34 changes: 34 additions & 0 deletions src/purl_eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ lazy_static! {
// "may only contain alphanumeric characters or single hyphens, and cannot begin or end with a hyphen"
pub static ref GITHUB_USERNAME_REGEX: regex::Regex =
regex::Regex::new(r"^[a-zA-Z0-9]+(-?[a-zA-Z0-9]+)*$").unwrap();

pub static ref GITHUB_REPO_NAME_REGEX: regex::Regex =
regex::Regex::new(r"^[a-zA-Z\._\-][a-zA-Z0-9\._\-]*$").unwrap();
}

#[derive(Debug, Clone, PartialEq, Eq)]
Expand Down Expand Up @@ -148,6 +151,37 @@ pub fn eval_purl_namespace(
EvalResult::aggregate(&findings)
}

pub fn eval_purl_name(
purl_name: String,
purl_namespace: purl_data::PurlNamespace,
typex: purl_data::PurlType,
) -> EvalResult {
// sanity check: ensure valid percent-encoding
if let Err(e) = urlencoding::decode(&purl_name) {
return EvalResult::Invalid(format!(
"could not decode, so it must not be a valid percent-encoded string ({e})"
));
}

let canonical_namespace = purl_namespace.as_canonical();
let mut findings = vec![];

match typex {
PurlType::Github => {
findings.push(if GITHUB_REPO_NAME_REGEX.is_match(&purl_name) {
EvalResult::ProbablyOk("name is valid for a GitHub repo".to_string())
} else {
EvalResult::AtLeastValid("name is not valid as a GitHub repo name".to_string())
});
}
_ => findings.push(EvalResult::ProbablyOk(
"do not have any type-specific name checks to perform".to_string(),
)),
}

EvalResult::aggregate(&findings)
}

#[cfg(test)]
mod tests {
use crate::purl_data::{PurlComponent, PurlNamespace, PurlType};
Expand Down

0 comments on commit 9b07dc8

Please sign in to comment.