Skip to content

Commit

Permalink
PR fix
Browse files Browse the repository at this point in the history
www. prefix solved
some docs added
  • Loading branch information
dimabershadskiy committed May 14, 2024
1 parent 2c6de0c commit 21c634b
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 14 deletions.
2 changes: 2 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ params = [
'utm_medium', # Identifies what type of link was used
'utm_term', # Identifies search terms
'utm_content', # Identifies what specifically was clicked to bring the user to the site
"youtube.com``si", # YouTube specific Source identifier using "{domain}``{param}" pattern
"youtu.be``si", # YouTube specific Source identifier using "{domain}``{param}" pattern
]
# Which exit params in URL should be unwrapped
exit = [
Expand Down
51 changes: 37 additions & 14 deletions src/clink.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ impl Clink {
let mut res = str.to_string();
for link in self.finder.links(str) {
let mut l = Url::parse(self.unwrap_exit_params(link.as_str()).as_str()).unwrap();
let query: Vec<(_, _)> = self.process_query(l.query_pairs(),l.domain());
let query: Vec<(_, _)> = self.process_query(
l.query_pairs(),
l.domain()
.unwrap_or_default()
.strip_prefix("www.")
.or(l.domain()),
);
l.set_query(None);
for pair in query {
l.query_pairs_mut()
Expand All @@ -46,7 +52,11 @@ impl Clink {
res
}

fn process_query(&self, query: url::form_urlencoded::Parse<'_>, domain: Option<&str>) -> Vec<(String, String)> {
fn process_query(
&self,
query: url::form_urlencoded::Parse<'_>,
domain: Option<&str>,
) -> Vec<(String, String)> {
match self.config.mode {
Mode::Remove => self.filter(query, domain),
Mode::Replace => self.replace(query, domain),
Expand Down Expand Up @@ -82,21 +92,31 @@ impl Clink {
}
}

fn filter(&self, query: url::form_urlencoded::Parse<'_>, domain: Option<&str>) -> Vec<(String, String)> {
fn filter(
&self,
query: url::form_urlencoded::Parse<'_>,
domain: Option<&str>,
) -> Vec<(String, String)> {
query
.filter(|p| {
let global_absent = !self.config.params.contains::<Rc<str>>(&p.0.clone().into());
return global_absent &&
if let Some(domain_val) = domain {
global_absent
&& if let Some(domain_val) = domain {
let param_name = format!("{}``{}", domain_val, p.0);
return !self.config.params.contains::<Rc<str>>(&param_name.into());
} else {true}
} else {
true

Check warning on line 108 in src/clink.rs

View check run for this annotation

Codecov / codecov/patch

src/clink.rs#L108

Added line #L108 was not covered by tests
}
})
.map(|p| (p.0.to_string(), p.1.to_string()))
.collect()
}

fn replace(&self, query: url::form_urlencoded::Parse<'_>, domain: Option<&str>) -> Vec<(String, String)> {
fn replace(
&self,
query: url::form_urlencoded::Parse<'_>,
domain: Option<&str>,
) -> Vec<(String, String)> {
query
.map(|p| {
if self.config.params.contains::<Rc<str>>(&p.0.clone().into()) {
Expand Down Expand Up @@ -291,13 +311,20 @@ mod find_and_replace {
"https://youtu.be/dQw4w9WgXcQ"
);

assert_eq!(
clink.find_and_replace("https://www.youtu.be/dQw4w9WgXcQ?si=NblIBgit-qHN7MoH",),
"https://www.youtu.be/dQw4w9WgXcQ"
);

assert_eq!(
clink.find_and_replace("https://youtu.be/dQw4w9WgXcQ?si=NblIBgit-qHN7MoH&t=69",),
"https://youtu.be/dQw4w9WgXcQ?t=69"
);

assert_eq!(
clink.find_and_replace("https://youtu.be/dQw4w9WgXcQ?si=NblIBgit-qHN7MoH&t=69&fbclid=clid",),
clink.find_and_replace(
"https://youtu.be/dQw4w9WgXcQ?si=NblIBgit-qHN7MoH&t=69&fbclid=clid",
),
"https://youtu.be/dQw4w9WgXcQ?t=69"
);

Expand All @@ -323,16 +350,12 @@ mod find_and_replace {

let clink = Clink::new(ClinkConfig::new(Mode::YourMom));
assert_eq!(
clink.find_and_replace(
"https://test.test/?si=dsadsa",
),
clink.find_and_replace("https://test.test/?si=dsadsa",),
"https://test.test/?si=dsadsa&utm_source=your_mom"
);

assert_eq!(
clink.find_and_replace(
"https://youtu.be/?si=dsadsa",
),
clink.find_and_replace("https://youtu.be/?si=dsadsa",),
"https://youtu.be/?utm_source=your_mom"
);
}
Expand Down
3 changes: 3 additions & 0 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ use serde::{Deserialize, Serialize};

use crate::mode::Mode;

/// add query param, that must be replaced within any domain
/// to specify domain specific params use format
/// "{domain}``{param}"
fn get_default_params() -> HashSet<Rc<str>> {
HashSet::from([
"fbclid".into(),
Expand Down

0 comments on commit 21c634b

Please sign in to comment.