use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RelatedIdentifier {
pub identifier: String,
pub relation: RelationType,
pub scheme: IdentifierScheme,
}
impl RelatedIdentifier {
pub fn is_identical_to(identifier: impl Into<String>) -> Self {
let id = identifier.into();
let scheme = if id.starts_with("10.") {
IdentifierScheme::Doi
} else if id.starts_with("http") {
IdentifierScheme::Url
} else {
IdentifierScheme::Other
};
Self { identifier: id, relation: RelationType::IsIdenticalTo, scheme }
}
pub fn is_supplement_to(identifier: impl Into<String>) -> Self {
let id = identifier.into();
let scheme =
if id.starts_with("10.") { IdentifierScheme::Doi } else { IdentifierScheme::Url };
Self { identifier: id, relation: RelationType::IsSupplementTo, scheme }
}
pub fn cites(identifier: impl Into<String>) -> Self {
Self {
identifier: identifier.into(),
relation: RelationType::Cites,
scheme: IdentifierScheme::Doi,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RelationType {
IsCitedBy,
Cites,
IsSupplementTo,
IsSupplementedBy,
IsContinuedBy,
Continues,
IsDescribedBy,
Describes,
HasMetadata,
IsMetadataFor,
HasVersion,
IsVersionOf,
IsNewVersionOf,
IsPreviousVersionOf,
IsPartOf,
HasPart,
IsReferencedBy,
References,
IsDocumentedBy,
Documents,
IsCompiledBy,
Compiles,
IsVariantFormOf,
IsOriginalFormOf,
IsIdenticalTo,
IsReviewedBy,
Reviews,
IsDerivedFrom,
IsSourceOf,
IsRequiredBy,
Requires,
IsObsoletedBy,
Obsoletes,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum IdentifierScheme {
Doi,
Url,
Orcid,
Ror,
Arxiv,
Pmid,
Other,
}