use criterium::number::AsInteger;
use serde::{Serialize,Deserialize};
use url::Url;
use crate::content::InformationSource;
use crate::content::LocationSignature;
#[derive(Clone,Debug,Serialize,Deserialize)]
pub struct Link {
pub to_url: Url,
pub source: InformationSource,
pub text: Option<String>,
pub rel: Vec<String>,
pub html_tag_name: String,
pub location_signature: LocationSignature,
pub link_locality: LinkLocality,
pub contains_headline: bool,
}
#[repr(u8)]
#[derive(Clone,Debug,PartialEq,Eq,Serialize,Deserialize)]
pub enum LinkLocality {
SelfLink = 0,
InLink = 1,
OutLink = 2,
}
impl Default for LinkLocality {
fn default() -> Self {
Self::OutLink
}
}
impl LinkLocality {
pub fn new(link_url: &Url, document_url: &Url) -> Self {
if !link_url.has_host() {
return Self::OutLink;
}
if link_url.host() != document_url.host() {
return Self::OutLink;
}
if link_url.port() != document_url.port() {
return Self::OutLink;
}
let link_scheme = link_url.scheme();
let document_scheme = document_url.scheme();
if link_scheme != document_scheme &&
link_scheme.strip_suffix('s').unwrap_or(link_scheme)
!= document_scheme.strip_suffix('s').unwrap_or(document_scheme)
{
return Self::OutLink;
}
if link_url.path() != document_url.path() {
return Self::InLink;
}
if link_url.query() != document_url.query() {
return Self::InLink;
}
return Self::SelfLink;
}
pub fn from_u8_or_outlink(id: u8) -> Self {
match id {
0 => Self::SelfLink,
1 => Self::InLink,
_ => Self::OutLink,
}
}
}
impl AsInteger for LinkLocality {
fn as_criterium_i64(&self) -> i64 {
self.clone() as i64
}
}