Merge branch 'libimagentrylink-interface-redesign' into master
This commit is contained in:
commit
fd59d6d301
20 changed files with 219 additions and 220 deletions
|
@ -66,7 +66,7 @@ use libimagrt::runtime::Runtime;
|
||||||
use libimagrt::setup::generate_runtime_setup;
|
use libimagrt::setup::generate_runtime_setup;
|
||||||
use libimagstore::store::FileLockEntry;
|
use libimagstore::store::FileLockEntry;
|
||||||
use libimagstore::iter::get::StoreIdGetIteratorExtension;
|
use libimagstore::iter::get::StoreIdGetIteratorExtension;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
mod ui;
|
mod ui;
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ fn add(rt: &Runtime) {
|
||||||
.ok_or_else(|| format_err!("Not found: {}", id.local_display_string()))
|
.ok_or_else(|| format_err!("Not found: {}", id.local_display_string()))
|
||||||
.map_err_trace_exit_unwrap();
|
.map_err_trace_exit_unwrap();
|
||||||
|
|
||||||
let _ = entry.add_internal_link(&mut annotation).map_err_trace_exit_unwrap();
|
let _ = entry.add_link(&mut annotation).map_err_trace_exit_unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
if !scmd.is_present("dont-print-name") {
|
if !scmd.is_present("dont-print-name") {
|
||||||
|
|
|
@ -55,7 +55,7 @@ use libimagerror::io::ToExitCode;
|
||||||
use libimagerror::exit::ExitUnwrap;
|
use libimagerror::exit::ExitUnwrap;
|
||||||
use libimagstore::store::FileLockEntry;
|
use libimagstore::store::FileLockEntry;
|
||||||
use libimagstore::storeid::StoreId;
|
use libimagstore::storeid::StoreId;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
use toml::Value;
|
use toml::Value;
|
||||||
use toml_query::read::TomlValueReadExt;
|
use toml_query::read::TomlValueReadExt;
|
||||||
|
@ -76,7 +76,7 @@ struct Diagnostic {
|
||||||
pub bytecount_content: usize,
|
pub bytecount_content: usize,
|
||||||
pub overall_byte_size: usize,
|
pub overall_byte_size: usize,
|
||||||
pub verified: bool,
|
pub verified: bool,
|
||||||
pub num_internal_links: usize,
|
pub num_links: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Diagnostic {
|
impl Diagnostic {
|
||||||
|
@ -100,7 +100,7 @@ impl Diagnostic {
|
||||||
bytecount_content: entry.get_content().as_str().len(),
|
bytecount_content: entry.get_content().as_str().len(),
|
||||||
overall_byte_size: entry.to_str()?.as_str().len(),
|
overall_byte_size: entry.to_str()?.as_str().len(),
|
||||||
verified: entry.verify().is_ok(),
|
verified: entry.verify().is_ok(),
|
||||||
num_internal_links: entry.get_internal_links().map(Iterator::count).unwrap_or(0),
|
num_links: entry.links().map(Iterator::count).unwrap_or(0),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,15 +176,15 @@ fn main() {
|
||||||
let mut max_overall_byte_size : Option<(usize, StoreId)> = None;
|
let mut max_overall_byte_size : Option<(usize, StoreId)> = None;
|
||||||
let mut verified_count = 0;
|
let mut verified_count = 0;
|
||||||
let mut unverified_count = 0;
|
let mut unverified_count = 0;
|
||||||
let mut num_internal_links = 0;
|
let mut num_links = 0;
|
||||||
let mut max_internal_links : Option<(usize, StoreId)> = None;
|
let mut max_links : Option<(usize, StoreId)> = None;
|
||||||
|
|
||||||
for diag in diags.iter() {
|
for diag in diags.iter() {
|
||||||
sum_header_sections += diag.header_sections;
|
sum_header_sections += diag.header_sections;
|
||||||
sum_bytecount_content += diag.bytecount_content;
|
sum_bytecount_content += diag.bytecount_content;
|
||||||
sum_overall_byte_size += diag.overall_byte_size;
|
sum_overall_byte_size += diag.overall_byte_size;
|
||||||
match max_overall_byte_size {
|
match max_overall_byte_size {
|
||||||
None => max_overall_byte_size = Some((diag.num_internal_links, diag.id.clone())),
|
None => max_overall_byte_size = Some((diag.num_links, diag.id.clone())),
|
||||||
Some((num, _)) => if num < diag.overall_byte_size {
|
Some((num, _)) => if num < diag.overall_byte_size {
|
||||||
max_overall_byte_size = Some((diag.overall_byte_size, diag.id.clone()));
|
max_overall_byte_size = Some((diag.overall_byte_size, diag.id.clone()));
|
||||||
}
|
}
|
||||||
|
@ -199,11 +199,11 @@ fn main() {
|
||||||
unverified_count += 1;
|
unverified_count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_internal_links += diag.num_internal_links;
|
num_links += diag.num_links;
|
||||||
match max_internal_links {
|
match max_links {
|
||||||
None => max_internal_links = Some((diag.num_internal_links, diag.id.clone())),
|
None => max_links = Some((diag.num_links, diag.id.clone())),
|
||||||
Some((num, _)) => if num < diag.num_internal_links {
|
Some((num, _)) => if num < diag.num_links {
|
||||||
max_internal_links = Some((diag.num_internal_links, diag.id.clone()));
|
max_links = Some((diag.num_links, diag.id.clone()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,9 +230,9 @@ fn main() {
|
||||||
do_write!(out, "Largest Entry ({} bytes): {}", num, path.local_display_string());
|
do_write!(out, "Largest Entry ({} bytes): {}", num, path.local_display_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
do_write!(out, "{} average internal link count per entry", num_internal_links / n);
|
do_write!(out, "{} average internal link count per entry", num_links / n);
|
||||||
|
|
||||||
if let Some((num, path)) = max_internal_links {
|
if let Some((num, path)) = max_links {
|
||||||
do_write!(out, "Entry with most internal links ({}): {}",
|
do_write!(out, "Entry with most internal links ({}): {}",
|
||||||
num,
|
num,
|
||||||
path.local_display_string());
|
path.local_display_string());
|
||||||
|
|
|
@ -63,7 +63,7 @@ use failure::Error;
|
||||||
use failure::err_msg;
|
use failure::err_msg;
|
||||||
|
|
||||||
use libimagentryurl::linker::UrlLinker;
|
use libimagentryurl::linker::UrlLinker;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use libimagentrylink::storecheck::StoreLinkConsistentExt;
|
use libimagentrylink::storecheck::StoreLinkConsistentExt;
|
||||||
use libimagerror::trace::{MapErrTrace, trace_error};
|
use libimagerror::trace::{MapErrTrace, trace_error};
|
||||||
use libimagerror::exit::ExitUnwrap;
|
use libimagerror::exit::ExitUnwrap;
|
||||||
|
@ -182,7 +182,7 @@ fn link_from_to<'a, I>(rt: &'a Runtime, from: &'a str, to: I)
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
let _ = from_entry
|
let _ = from_entry
|
||||||
.add_internal_link(&mut to_entry)
|
.add_link(&mut to_entry)
|
||||||
.map_err_trace_exit_unwrap();
|
.map_err_trace_exit_unwrap();
|
||||||
|
|
||||||
let _ = rt.report_touched(to_entry.get_location()).unwrap_or_exit();
|
let _ = rt.report_touched(to_entry.get_location()).unwrap_or_exit();
|
||||||
|
@ -222,7 +222,7 @@ fn remove_linking(rt: &Runtime) {
|
||||||
Err(e) => trace_error(&e),
|
Err(e) => trace_error(&e),
|
||||||
Ok(Some(mut to_entry)) => {
|
Ok(Some(mut to_entry)) => {
|
||||||
let _ = to_entry
|
let _ = to_entry
|
||||||
.remove_internal_link(&mut from)
|
.remove_link(&mut from)
|
||||||
.map_err_trace_exit_unwrap();
|
.map_err_trace_exit_unwrap();
|
||||||
|
|
||||||
let _ = rt.report_touched(to_entry.get_location()).unwrap_or_exit();
|
let _ = rt.report_touched(to_entry.get_location()).unwrap_or_exit();
|
||||||
|
@ -296,7 +296,7 @@ fn list_linkings(rt: &Runtime) {
|
||||||
.for_each(|id| {
|
.for_each(|id| {
|
||||||
match rt.store().get(id.clone()) {
|
match rt.store().get(id.clone()) {
|
||||||
Ok(Some(entry)) => {
|
Ok(Some(entry)) => {
|
||||||
for (i, link) in entry.get_internal_links().map_err_trace_exit_unwrap().enumerate() {
|
for (i, link) in entry.links().map_err_trace_exit_unwrap().enumerate() {
|
||||||
let link = link
|
let link = link
|
||||||
.to_str()
|
.to_str()
|
||||||
.map_warn_err(|e| format!("Failed to convert StoreId to string: {:?}", e))
|
.map_warn_err(|e| format!("Failed to convert StoreId to string: {:?}", e))
|
||||||
|
|
|
@ -56,7 +56,7 @@ use libimagerror::exit::ExitUnwrap;
|
||||||
use libimagstore::storeid::StoreId;
|
use libimagstore::storeid::StoreId;
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
use libimagstore::store::FileLockEntry;
|
use libimagstore::store::FileLockEntry;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use libimagstore::iter::get::StoreIdGetIteratorExtension;
|
use libimagstore::iter::get::StoreIdGetIteratorExtension;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -93,7 +93,7 @@ fn main() {
|
||||||
error!("Funny things happened: Entry moved to destination did not fail, but entry does not exist");
|
error!("Funny things happened: Entry moved to destination did not fail, but entry does not exist");
|
||||||
exit(1)
|
exit(1)
|
||||||
})
|
})
|
||||||
.get_internal_links()
|
.links()
|
||||||
.map_err_trace_exit_unwrap()
|
.map_err_trace_exit_unwrap()
|
||||||
.map(|link| Ok(link.get_store_id().clone()) as Result<_, _>)
|
.map(|link| Ok(link.get_store_id().clone()) as Result<_, _>)
|
||||||
.into_get_iter(rt.store())
|
.into_get_iter(rt.store())
|
||||||
|
@ -118,7 +118,7 @@ fn main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
for link in linked_entries.iter_mut() {
|
for link in linked_entries.iter_mut() {
|
||||||
let _ = entry.remove_internal_link(link).map_err_trace_exit_unwrap();
|
let _ = entry.remove_link(link).map_err_trace_exit_unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,6 +151,6 @@ fn relink<'a>(store: &'a Store, target: StoreId, linked_entries: &mut Vec<FileLo
|
||||||
|
|
||||||
|
|
||||||
for mut link in linked_entries {
|
for mut link in linked_entries {
|
||||||
let _ = entry.add_internal_link(&mut link).map_err_trace_exit_unwrap();
|
let _ = entry.add_link(&mut link).map_err_trace_exit_unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ extern crate libimagentrylink;
|
||||||
|
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
|
use std::ops::DerefMut;
|
||||||
|
|
||||||
use toml_query::read::TomlValueReadTypeExt;
|
use toml_query::read::TomlValueReadTypeExt;
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
|
@ -61,7 +62,7 @@ use libimagerror::trace::{MapErrTrace, trace_error};
|
||||||
use libimagerror::io::ToExitCode;
|
use libimagerror::io::ToExitCode;
|
||||||
use libimagerror::exit::ExitUnwrap;
|
use libimagerror::exit::ExitUnwrap;
|
||||||
use libimagutil::debug_result::DebugResult;
|
use libimagutil::debug_result::DebugResult;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
|
|
||||||
mod ui;
|
mod ui;
|
||||||
|
@ -107,8 +108,7 @@ fn add(rt: &Runtime) {
|
||||||
let _ = rt.report_touched(collection.get_location()).unwrap_or_exit();
|
let _ = rt.report_touched(collection.get_location()).unwrap_or_exit();
|
||||||
|
|
||||||
for url in scmd.values_of("urls").unwrap() { // unwrap saved by clap
|
for url in scmd.values_of("urls").unwrap() { // unwrap saved by clap
|
||||||
let new_ids = collection
|
let new_ids = BookmarkCollection::add_link(collection.deref_mut(), rt.store(), BookmarkLink::from(url))
|
||||||
.add_link(rt.store(), BookmarkLink::from(url))
|
|
||||||
.map_err_trace_exit_unwrap();
|
.map_err_trace_exit_unwrap();
|
||||||
|
|
||||||
let _ = rt.report_all_touched(new_ids.into_iter()).unwrap_or_exit();
|
let _ = rt.report_all_touched(new_ids.into_iter()).unwrap_or_exit();
|
||||||
|
@ -163,7 +163,7 @@ fn list(rt: &Runtime) {
|
||||||
let _ = rt.report_touched(collection.get_location()).unwrap_or_exit();
|
let _ = rt.report_touched(collection.get_location()).unwrap_or_exit();
|
||||||
|
|
||||||
collection
|
collection
|
||||||
.links(rt.store())
|
.get_links(rt.store())
|
||||||
.map_dbg_str("Listing...")
|
.map_dbg_str("Listing...")
|
||||||
.map_err_trace_exit_unwrap()
|
.map_err_trace_exit_unwrap()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -187,8 +187,7 @@ fn remove(rt: &Runtime) {
|
||||||
let _ = rt.report_touched(collection.get_location()).unwrap_or_exit();
|
let _ = rt.report_touched(collection.get_location()).unwrap_or_exit();
|
||||||
|
|
||||||
for url in scmd.values_of("urls").unwrap() { // enforced by clap
|
for url in scmd.values_of("urls").unwrap() { // enforced by clap
|
||||||
let removed_links = collection
|
let removed_links = BookmarkCollection::remove_link(collection.deref_mut(), rt.store(), BookmarkLink::from(url))
|
||||||
.remove_link(rt.store(), BookmarkLink::from(url))
|
|
||||||
.map_err_trace_exit_unwrap();
|
.map_err_trace_exit_unwrap();
|
||||||
|
|
||||||
let _ = rt.report_all_touched(removed_links.into_iter()).unwrap_or_exit();
|
let _ = rt.report_all_touched(removed_links.into_iter()).unwrap_or_exit();
|
||||||
|
|
|
@ -252,7 +252,7 @@ fn show(rt: &Runtime, wiki_name: &str) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn delete(rt: &Runtime, wiki_name: &str) {
|
fn delete(rt: &Runtime, wiki_name: &str) {
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
let scmd = rt.cli().subcommand_matches("delete").unwrap(); // safed by clap
|
let scmd = rt.cli().subcommand_matches("delete").unwrap(); // safed by clap
|
||||||
let name = String::from(scmd.value_of("delete-name").unwrap()); // safe by clap
|
let name = String::from(scmd.value_of("delete-name").unwrap()); // safe by clap
|
||||||
|
|
|
@ -36,7 +36,7 @@ use libimagstore::store::FileLockEntry;
|
||||||
use libimagstore::storeid::StoreId;
|
use libimagstore::storeid::StoreId;
|
||||||
use libimagentryurl::linker::UrlLinker;
|
use libimagentryurl::linker::UrlLinker;
|
||||||
use libimagentryurl::iter::UrlIter;
|
use libimagentryurl::iter::UrlIter;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use libimagentrylink::link::Link as StoreLink;
|
use libimagentrylink::link::Link as StoreLink;
|
||||||
|
|
||||||
use crate::link::Link;
|
use crate::link::Link;
|
||||||
|
@ -80,8 +80,8 @@ impl<'a> BookmarkCollectionStore<'a> for Store {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait BookmarkCollection : Sized + InternalLinker + UrlLinker {
|
pub trait BookmarkCollection : Sized + Linkable + UrlLinker {
|
||||||
fn links<'a>(&self, store: &'a Store) -> Result<UrlIter<'a>>;
|
fn get_links<'a>(&self, store: &'a Store) -> Result<UrlIter<'a>>;
|
||||||
fn link_entries(&self) -> Result<Vec<StoreLink>>;
|
fn link_entries(&self) -> Result<Vec<StoreLink>>;
|
||||||
fn add_link(&mut self, store: &Store, l: Link) -> Result<Vec<StoreId>>;
|
fn add_link(&mut self, store: &Store, l: Link) -> Result<Vec<StoreId>>;
|
||||||
fn get_links_matching<'a>(&self, store: &'a Store, r: Regex) -> Result<LinksMatchingRegexIter<'a>>;
|
fn get_links_matching<'a>(&self, store: &'a Store, r: Regex) -> Result<LinksMatchingRegexIter<'a>>;
|
||||||
|
@ -90,13 +90,13 @@ pub trait BookmarkCollection : Sized + InternalLinker + UrlLinker {
|
||||||
|
|
||||||
impl BookmarkCollection for Entry {
|
impl BookmarkCollection for Entry {
|
||||||
|
|
||||||
fn links<'a>(&self, store: &'a Store) -> Result<UrlIter<'a>> {
|
fn get_links<'a>(&self, store: &'a Store) -> Result<UrlIter<'a>> {
|
||||||
self.get_urls(store)
|
self.get_urls(store)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn link_entries(&self) -> Result<Vec<StoreLink>> {
|
fn link_entries(&self) -> Result<Vec<StoreLink>> {
|
||||||
use libimagentryurl::util::is_external_link_storeid;
|
use libimagentryurl::util::is_external_link_storeid;
|
||||||
self.get_internal_links().map(|v| v.filter(|id| is_external_link_storeid(id)).collect())
|
self.links().map(|v| v.filter(|id| is_external_link_storeid(id)).collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_link(&mut self, store: &Store, l: Link) -> Result<Vec<StoreId>> {
|
fn add_link(&mut self, store: &Store, l: Link) -> Result<Vec<StoreId>> {
|
||||||
|
|
|
@ -33,7 +33,7 @@ use crate::util::IsHabitCheck;
|
||||||
use crate::util::get_string_header_from_entry;
|
use crate::util::get_string_header_from_entry;
|
||||||
use crate::instance::IsHabitInstance;
|
use crate::instance::IsHabitInstance;
|
||||||
|
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
use libimagstore::store::FileLockEntry;
|
use libimagstore::store::FileLockEntry;
|
||||||
use libimagstore::store::Entry;
|
use libimagstore::store::Entry;
|
||||||
|
@ -129,7 +129,7 @@ impl HabitTemplate for Entry {
|
||||||
|
|
||||||
fn linked_instances(&self) -> Result<HabitInstanceStoreIdIterator> {
|
fn linked_instances(&self) -> Result<HabitInstanceStoreIdIterator> {
|
||||||
let iter = self
|
let iter = self
|
||||||
.get_internal_links()?
|
.links()?
|
||||||
.map(|link| link.get_store_id().clone())
|
.map(|link| link.get_store_id().clone())
|
||||||
.filter(IsHabitCheck::is_habit_instance)
|
.filter(IsHabitCheck::is_habit_instance)
|
||||||
.map(Ok);
|
.map(Ok);
|
||||||
|
@ -239,7 +239,7 @@ impl HabitTemplate for Entry {
|
||||||
let name = self.habit_name()?;
|
let name = self.habit_name()?;
|
||||||
let date = date_to_string(date);
|
let date = date_to_string(date);
|
||||||
|
|
||||||
for link in self.get_internal_links()? {
|
for link in self.links()? {
|
||||||
let sid = link.get_store_id();
|
let sid = link.get_store_id();
|
||||||
let instance_id = instance_id_for_name_and_datestr(&name, &date)?;
|
let instance_id = instance_id_for_name_and_datestr(&name, &date)?;
|
||||||
|
|
||||||
|
@ -410,7 +410,7 @@ fn postprocess_instance<'a>(mut entry: FileLockEntry<'a>,
|
||||||
let _ = hdr.insert("habit.instance.comment", Value::String(comment))?;
|
let _ = hdr.insert("habit.instance.comment", Value::String(comment))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry.add_internal_link(template)?;
|
entry.add_link(template)?;
|
||||||
|
|
||||||
Ok(entry)
|
Ok(entry)
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,8 +55,8 @@ impl WikiEntry for Entry {
|
||||||
///
|
///
|
||||||
fn autolink(&mut self, store: &Store) -> Result<()> {
|
fn autolink(&mut self, store: &Store) -> Result<()> {
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(true)
|
.process_links(true)
|
||||||
.create_internal_targets(true)
|
.create_targets(true)
|
||||||
.process_urls(true)
|
.process_urls(true)
|
||||||
.process_refs(true);
|
.process_refs(true);
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ use std::path::PathBuf;
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
use libimagstore::store::FileLockEntry;
|
use libimagstore::store::FileLockEntry;
|
||||||
use libimagstore::iter::Entries;
|
use libimagstore::iter::Entries;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
use failure::Fallible as Result;
|
use failure::Fallible as Result;
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
|
@ -78,7 +78,7 @@ impl<'a, 'b> Wiki<'a, 'b> {
|
||||||
.ok_or_else(|| err_msg("Missing index page"))?;
|
.ok_or_else(|| err_msg("Missing index page"))?;
|
||||||
let mut entry = self.0.create(sid)?;
|
let mut entry = self.0.create(sid)?;
|
||||||
|
|
||||||
entry.add_internal_link(&mut index).map(|_| entry)
|
entry.add_link(&mut index).map(|_| entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn retrieve_entry<EN: AsRef<str>>(&self, entry_name: EN) -> Result<FileLockEntry<'a>> {
|
pub fn retrieve_entry<EN: AsRef<str>>(&self, entry_name: EN) -> Result<FileLockEntry<'a>> {
|
||||||
|
@ -89,7 +89,7 @@ impl<'a, 'b> Wiki<'a, 'b> {
|
||||||
.ok_or_else(|| err_msg("Missing index page"))?;
|
.ok_or_else(|| err_msg("Missing index page"))?;
|
||||||
let mut entry = self.0.retrieve(sid)?;
|
let mut entry = self.0.retrieve(sid)?;
|
||||||
|
|
||||||
entry.add_internal_link(&mut index).map(|_| entry)
|
entry.add_link(&mut index).map(|_| entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn all_ids(&self) -> Result<Entries<'a>> {
|
pub fn all_ids(&self) -> Result<Entries<'a>> {
|
||||||
|
|
|
@ -24,7 +24,7 @@ use libimagstore::store::Entry;
|
||||||
use libimagstore::store::FileLockEntry;
|
use libimagstore::store::FileLockEntry;
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
use libimagstore::storeid::StoreIdIterator;
|
use libimagstore::storeid::StoreIdIterator;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use libimagentryutil::isa::Is;
|
use libimagentryutil::isa::Is;
|
||||||
use libimagentryutil::isa::IsKindHeaderPathProvider;
|
use libimagentryutil::isa::IsKindHeaderPathProvider;
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ impl Annotateable for Entry {
|
||||||
Ok(anno)
|
Ok(anno)
|
||||||
})
|
})
|
||||||
.and_then(|mut anno| {
|
.and_then(|mut anno| {
|
||||||
anno.add_internal_link(self)
|
anno.add_link(self)
|
||||||
.context(err_msg("Linking error"))
|
.context(err_msg("Linking error"))
|
||||||
.map_err(Error::from)
|
.map_err(Error::from)
|
||||||
.map(|_| anno)
|
.map(|_| anno)
|
||||||
|
@ -74,7 +74,7 @@ impl Annotateable for Entry {
|
||||||
// exist.
|
// exist.
|
||||||
fn denotate<'a>(&mut self, store: &'a Store, ann_name: &str) -> Result<Option<FileLockEntry<'a>>> {
|
fn denotate<'a>(&mut self, store: &'a Store, ann_name: &str) -> Result<Option<FileLockEntry<'a>>> {
|
||||||
if let Some(mut annotation) = store.get(crate::module_path::new_id(ann_name)?)? {
|
if let Some(mut annotation) = store.get(crate::module_path::new_id(ann_name)?)? {
|
||||||
let _ = self.remove_internal_link(&mut annotation)?;
|
let _ = self.remove_link(&mut annotation)?;
|
||||||
Ok(Some(annotation))
|
Ok(Some(annotation))
|
||||||
} else {
|
} else {
|
||||||
// error: annotation does not exist
|
// error: annotation does not exist
|
||||||
|
@ -84,7 +84,7 @@ impl Annotateable for Entry {
|
||||||
|
|
||||||
/// Get all annotations of an entry
|
/// Get all annotations of an entry
|
||||||
fn annotations(&self) -> Result<StoreIdIterator> {
|
fn annotations(&self) -> Result<StoreIdIterator> {
|
||||||
self.get_internal_links()
|
self.links()
|
||||||
.map(|it| {
|
.map(|it| {
|
||||||
it.filter(|link| link.get_store_id().is_in_collection(&["annotation"]))
|
it.filter(|link| link.get_store_id().is_in_collection(&["annotation"]))
|
||||||
.map(|link| Ok(link.get_store_id().clone()))
|
.map(|link| Ok(link.get_store_id().clone()))
|
||||||
|
|
|
@ -22,7 +22,7 @@ use libimagentryutil::isa::IsKindHeaderPathProvider;
|
||||||
use libimagstore::store::Entry;
|
use libimagstore::store::Entry;
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
use libimagstore::storeid::StoreIdIterator;
|
use libimagstore::storeid::StoreIdIterator;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
use toml_query::read::TomlValueReadTypeExt;
|
use toml_query::read::TomlValueReadTypeExt;
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ impl Category for Entry {
|
||||||
|
|
||||||
fn get_entries<'a>(&self, store: &'a Store) -> Result<CategoryEntryIterator<'a>> {
|
fn get_entries<'a>(&self, store: &'a Store) -> Result<CategoryEntryIterator<'a>> {
|
||||||
trace!("Getting linked entries for category '{:?}'", self.get_location());
|
trace!("Getting linked entries for category '{:?}'", self.get_location());
|
||||||
let sit = self.get_internal_links()?.map(|l| l.get_store_id().clone()).map(Ok);
|
let sit = self.links()?.map(|l| l.get_store_id().clone()).map(Ok);
|
||||||
let sit = StoreIdIterator::new(Box::new(sit));
|
let sit = StoreIdIterator::new(Box::new(sit));
|
||||||
let name = self.get_name()?;
|
let name = self.get_name()?;
|
||||||
Ok(CategoryEntryIterator::new(store, sit, name))
|
Ok(CategoryEntryIterator::new(store, sit, name))
|
||||||
|
|
|
@ -23,7 +23,7 @@ use toml_query::read::TomlValueReadTypeExt;
|
||||||
use toml::Value;
|
use toml::Value;
|
||||||
|
|
||||||
use libimagstore::store::Entry;
|
use libimagstore::store::Entry;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use libimagerror::errors::ErrorMsg as EM;
|
use libimagerror::errors::ErrorMsg as EM;
|
||||||
|
|
||||||
use failure::Fallible as Result;
|
use failure::Fallible as Result;
|
||||||
|
@ -68,7 +68,7 @@ impl EntryCategory for Entry {
|
||||||
.ok_or_else(|| Error::from(err_msg("Category does not exist")))?;
|
.ok_or_else(|| Error::from(err_msg("Category does not exist")))?;
|
||||||
|
|
||||||
let _ = self.set_category(s)?;
|
let _ = self.set_category(s)?;
|
||||||
let _ = self.add_internal_link(&mut category)?;
|
let _ = self.add_link(&mut category)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,7 @@ impl CategoryStore for Store {
|
||||||
///
|
///
|
||||||
/// Automatically removes all category settings from entries which are linked to this category.
|
/// Automatically removes all category settings from entries which are linked to this category.
|
||||||
fn delete_category(&self, name: &str) -> Result<()> {
|
fn delete_category(&self, name: &str) -> Result<()> {
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use crate::category::Category;
|
use crate::category::Category;
|
||||||
|
|
||||||
trace!("Deleting category: '{}'", name);
|
trace!("Deleting category: '{}'", name);
|
||||||
|
@ -97,7 +97,7 @@ impl CategoryStore for Store {
|
||||||
|
|
||||||
for entry in category.get_entries(self)? {
|
for entry in category.get_entries(self)? {
|
||||||
let mut entry = entry?;
|
let mut entry = entry?;
|
||||||
let _ = category.remove_internal_link(&mut entry)?;
|
let _ = category.remove_link(&mut entry)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ extern crate libimagutil;
|
||||||
module_entry_path_mod!("links");
|
module_entry_path_mod!("links");
|
||||||
|
|
||||||
pub mod iter;
|
pub mod iter;
|
||||||
pub mod linker;
|
pub mod linkable;
|
||||||
pub mod link;
|
pub mod link;
|
||||||
pub mod storecheck;
|
pub mod storecheck;
|
||||||
|
|
||||||
|
|
|
@ -35,27 +35,27 @@ use crate::link::Link;
|
||||||
|
|
||||||
use toml::Value;
|
use toml::Value;
|
||||||
|
|
||||||
pub trait InternalLinker {
|
pub trait Linkable {
|
||||||
|
|
||||||
/// Get the internal links from the implementor object
|
/// Get the internal links from the implementor object
|
||||||
fn get_internal_links(&self) -> Result<LinkIter>;
|
fn links(&self) -> Result<LinkIter>;
|
||||||
|
|
||||||
/// Add an internal link to the implementor object
|
/// Add an internal link to the implementor object
|
||||||
fn add_internal_link(&mut self, link: &mut Entry) -> Result<()>;
|
fn add_link(&mut self, link: &mut Entry) -> Result<()>;
|
||||||
|
|
||||||
/// Remove an internal link from the implementor object
|
/// Remove an internal link from the implementor object
|
||||||
fn remove_internal_link(&mut self, link: &mut Entry) -> Result<()>;
|
fn remove_link(&mut self, link: &mut Entry) -> Result<()>;
|
||||||
|
|
||||||
/// Remove _all_ internal links
|
/// Remove _all_ internal links
|
||||||
fn unlink(&mut self, store: &Store) -> Result<()>;
|
fn unlink(&mut self, store: &Store) -> Result<()>;
|
||||||
|
|
||||||
/// Add internal annotated link
|
/// Add internal annotated link
|
||||||
fn add_internal_annotated_link(&mut self, link: &mut Entry, annotation: String) -> Result<()>;
|
fn add_annotated_link(&mut self, link: &mut Entry, annotation: String) -> Result<()>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InternalLinker for Entry {
|
impl Linkable for Entry {
|
||||||
|
|
||||||
fn get_internal_links(&self) -> Result<LinkIter> {
|
fn links(&self) -> Result<LinkIter> {
|
||||||
debug!("Getting internal links");
|
debug!("Getting internal links");
|
||||||
trace!("Getting internal links from header of '{}' = {:?}", self.get_location(), self.get_header());
|
trace!("Getting internal links from header of '{}' = {:?}", self.get_location(), self.get_header());
|
||||||
let res = self
|
let res = self
|
||||||
|
@ -69,13 +69,13 @@ impl InternalLinker for Entry {
|
||||||
process_rw_result(res)
|
process_rw_result(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_internal_link(&mut self, link: &mut Entry) -> Result<()> {
|
fn add_link(&mut self, link: &mut Entry) -> Result<()> {
|
||||||
debug!("Adding internal link: {:?}", link);
|
debug!("Adding internal link: {:?}", link);
|
||||||
let location = link.get_location().clone().into();
|
let location = link.get_location().clone().into();
|
||||||
add_internal_link_with_instance(self, link, location)
|
add_link_with_instance(self, link, location)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_internal_link(&mut self, link: &mut Entry) -> Result<()> {
|
fn remove_link(&mut self, link: &mut Entry) -> Result<()> {
|
||||||
debug!("Removing internal link: {:?}", link);
|
debug!("Removing internal link: {:?}", link);
|
||||||
|
|
||||||
// Cloning because of borrowing
|
// Cloning because of borrowing
|
||||||
|
@ -84,13 +84,13 @@ impl InternalLinker for Entry {
|
||||||
|
|
||||||
debug!("Removing internal link from {:?} to {:?}", own_loc, other_loc);
|
debug!("Removing internal link from {:?} to {:?}", own_loc, other_loc);
|
||||||
|
|
||||||
let links = link.get_internal_links()?;
|
let links = link.links()?;
|
||||||
debug!("Rewriting own links for {:?}, without {:?}", other_loc, own_loc);
|
debug!("Rewriting own links for {:?}, without {:?}", other_loc, own_loc);
|
||||||
|
|
||||||
let links = links.filter(|l| !l.eq_store_id(&own_loc));
|
let links = links.filter(|l| !l.eq_store_id(&own_loc));
|
||||||
let _ = rewrite_links(link.get_header_mut(), links)?;
|
let _ = rewrite_links(link.get_header_mut(), links)?;
|
||||||
|
|
||||||
self.get_internal_links()
|
self.links()
|
||||||
.and_then(|links| {
|
.and_then(|links| {
|
||||||
debug!("Rewriting own links for {:?}, without {:?}", own_loc, other_loc);
|
debug!("Rewriting own links for {:?}, without {:?}", own_loc, other_loc);
|
||||||
let links = links.filter(|l| !l.eq_store_id(&other_loc));
|
let links = links.filter(|l| !l.eq_store_id(&other_loc));
|
||||||
|
@ -99,9 +99,9 @@ impl InternalLinker for Entry {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unlink(&mut self, store: &Store) -> Result<()> {
|
fn unlink(&mut self, store: &Store) -> Result<()> {
|
||||||
for id in self.get_internal_links()?.map(|l| l.get_store_id().clone()) {
|
for id in self.links()?.map(|l| l.get_store_id().clone()) {
|
||||||
match store.get(id).context("Failed to get entry")? {
|
match store.get(id).context("Failed to get entry")? {
|
||||||
Some(mut entry) => self.remove_internal_link(&mut entry)?,
|
Some(mut entry) => self.remove_link(&mut entry)?,
|
||||||
None => return Err(err_msg("Link target does not exist")),
|
None => return Err(err_msg("Link target does not exist")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,23 +109,23 @@ impl InternalLinker for Entry {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_internal_annotated_link(&mut self, link: &mut Entry, annotation: String) -> Result<()> {
|
fn add_annotated_link(&mut self, link: &mut Entry, annotation: String) -> Result<()> {
|
||||||
let new_link = Link::Annotated {
|
let new_link = Link::Annotated {
|
||||||
link: link.get_location().clone(),
|
link: link.get_location().clone(),
|
||||||
annotation: annotation,
|
annotation: annotation,
|
||||||
};
|
};
|
||||||
|
|
||||||
add_internal_link_with_instance(self, link, new_link)
|
add_link_with_instance(self, link, new_link)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_internal_link_with_instance(this: &mut Entry, link: &mut Entry, instance: Link) -> Result<()> {
|
fn add_link_with_instance(this: &mut Entry, link: &mut Entry, instance: Link) -> Result<()> {
|
||||||
debug!("Adding internal link from {:?} to {:?}", this.get_location(), instance);
|
debug!("Adding internal link from {:?} to {:?}", this.get_location(), instance);
|
||||||
|
|
||||||
add_foreign_link(link, this.get_location().clone())
|
add_foreign_link(link, this.get_location().clone())
|
||||||
.and_then(|_| {
|
.and_then(|_| {
|
||||||
this.get_internal_links()
|
this.links()
|
||||||
.and_then(|links| {
|
.and_then(|links| {
|
||||||
let links = links.chain(LinkIter::new(vec![instance]));
|
let links = links.chain(LinkIter::new(vec![instance]));
|
||||||
rewrite_links(this.get_header_mut(), links)
|
rewrite_links(this.get_header_mut(), links)
|
||||||
|
@ -156,7 +156,7 @@ fn rewrite_links<I: Iterator<Item = Link>>(header: &mut Value, links: I) -> Resu
|
||||||
/// This is a helper function which does this.
|
/// This is a helper function which does this.
|
||||||
fn add_foreign_link(target: &mut Entry, from: StoreId) -> Result<()> {
|
fn add_foreign_link(target: &mut Entry, from: StoreId) -> Result<()> {
|
||||||
debug!("Linking back from {:?} to {:?}", target.get_location(), from);
|
debug!("Linking back from {:?} to {:?}", target.get_location(), from);
|
||||||
target.get_internal_links()
|
target.links()
|
||||||
.and_then(|links| {
|
.and_then(|links| {
|
||||||
let links = links
|
let links = links
|
||||||
.chain(LinkIter::new(vec![from.into()]))
|
.chain(LinkIter::new(vec![from.into()]))
|
||||||
|
@ -258,7 +258,7 @@ mod test {
|
||||||
|
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
|
|
||||||
use super::InternalLinker;
|
use super::Linkable;
|
||||||
use super::Link;
|
use super::Link;
|
||||||
|
|
||||||
fn setup_logging() {
|
fn setup_logging() {
|
||||||
|
@ -274,7 +274,7 @@ mod test {
|
||||||
setup_logging();
|
setup_logging();
|
||||||
let store = get_store();
|
let store = get_store();
|
||||||
let entry = store.create(PathBuf::from("test_new_entry_no_links")).unwrap();
|
let entry = store.create(PathBuf::from("test_new_entry_no_links")).unwrap();
|
||||||
let links = entry.get_internal_links();
|
let links = entry.links();
|
||||||
assert!(links.is_ok());
|
assert!(links.is_ok());
|
||||||
let links = links.unwrap();
|
let links = links.unwrap();
|
||||||
assert_eq!(links.collect::<Vec<_>>().len(), 0);
|
assert_eq!(links.collect::<Vec<_>>().len(), 0);
|
||||||
|
@ -285,16 +285,16 @@ mod test {
|
||||||
setup_logging();
|
setup_logging();
|
||||||
let store = get_store();
|
let store = get_store();
|
||||||
let mut e1 = store.create(PathBuf::from("test_link_two_entries1")).unwrap();
|
let mut e1 = store.create(PathBuf::from("test_link_two_entries1")).unwrap();
|
||||||
assert!(e1.get_internal_links().is_ok());
|
assert!(e1.links().is_ok());
|
||||||
|
|
||||||
let mut e2 = store.create(PathBuf::from("test_link_two_entries2")).unwrap();
|
let mut e2 = store.create(PathBuf::from("test_link_two_entries2")).unwrap();
|
||||||
assert!(e2.get_internal_links().is_ok());
|
assert!(e2.links().is_ok());
|
||||||
|
|
||||||
{
|
{
|
||||||
assert!(e1.add_internal_link(&mut e2).is_ok());
|
assert!(e1.add_link(&mut e2).is_ok());
|
||||||
|
|
||||||
let e1_links = e1.get_internal_links().unwrap().collect::<Vec<_>>();
|
let e1_links = e1.links().unwrap().collect::<Vec<_>>();
|
||||||
let e2_links = e2.get_internal_links().unwrap().collect::<Vec<_>>();
|
let e2_links = e2.links().unwrap().collect::<Vec<_>>();
|
||||||
|
|
||||||
debug!("1 has links: {:?}", e1_links);
|
debug!("1 has links: {:?}", e1_links);
|
||||||
debug!("2 has links: {:?}", e2_links);
|
debug!("2 has links: {:?}", e2_links);
|
||||||
|
@ -307,14 +307,14 @@ mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
assert!(e1.remove_internal_link(&mut e2).is_ok());
|
assert!(e1.remove_link(&mut e2).is_ok());
|
||||||
|
|
||||||
debug!("{:?}", e2.to_str());
|
debug!("{:?}", e2.to_str());
|
||||||
let e2_links = e2.get_internal_links().unwrap().collect::<Vec<_>>();
|
let e2_links = e2.links().unwrap().collect::<Vec<_>>();
|
||||||
assert_eq!(e2_links.len(), 0, "Expected [], got: {:?}", e2_links);
|
assert_eq!(e2_links.len(), 0, "Expected [], got: {:?}", e2_links);
|
||||||
|
|
||||||
debug!("{:?}", e1.to_str());
|
debug!("{:?}", e1.to_str());
|
||||||
let e1_links = e1.get_internal_links().unwrap().collect::<Vec<_>>();
|
let e1_links = e1.links().unwrap().collect::<Vec<_>>();
|
||||||
assert_eq!(e1_links.len(), 0, "Expected [], got: {:?}", e1_links);
|
assert_eq!(e1_links.len(), 0, "Expected [], got: {:?}", e1_links);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -331,69 +331,69 @@ mod test {
|
||||||
let mut e4 = store.retrieve(PathBuf::from("4")).unwrap();
|
let mut e4 = store.retrieve(PathBuf::from("4")).unwrap();
|
||||||
let mut e5 = store.retrieve(PathBuf::from("5")).unwrap();
|
let mut e5 = store.retrieve(PathBuf::from("5")).unwrap();
|
||||||
|
|
||||||
assert!(e1.add_internal_link(&mut e2).is_ok());
|
assert!(e1.add_link(&mut e2).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e1.add_internal_link(&mut e3).is_ok());
|
assert!(e1.add_link(&mut e3).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 2);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 2);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e1.add_internal_link(&mut e4).is_ok());
|
assert!(e1.add_link(&mut e4).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 3);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 3);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e1.add_internal_link(&mut e5).is_ok());
|
assert!(e1.add_link(&mut e5).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 4);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 4);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
|
|
||||||
assert!(e5.remove_internal_link(&mut e1).is_ok());
|
assert!(e5.remove_link(&mut e1).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 3);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 3);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e4.remove_internal_link(&mut e1).is_ok());
|
assert!(e4.remove_link(&mut e1).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 2);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 2);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e3.remove_internal_link(&mut e1).is_ok());
|
assert!(e3.remove_link(&mut e1).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e2.remove_internal_link(&mut e1).is_ok());
|
assert!(e2.remove_link(&mut e1).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e4.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e4.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e5.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e5.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,18 +405,18 @@ mod test {
|
||||||
let mut e1 = store.retrieve(PathBuf::from("1")).unwrap();
|
let mut e1 = store.retrieve(PathBuf::from("1")).unwrap();
|
||||||
let mut e2 = store.retrieve(PathBuf::from("2")).unwrap();
|
let mut e2 = store.retrieve(PathBuf::from("2")).unwrap();
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e1.add_internal_link(&mut e2).is_ok());
|
assert!(e1.add_link(&mut e2).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
|
|
||||||
assert!(e1.remove_internal_link(&mut e2).is_ok());
|
assert!(e1.remove_link(&mut e2).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -428,40 +428,40 @@ mod test {
|
||||||
let mut e2 = store.retrieve(PathBuf::from("2")).unwrap();
|
let mut e2 = store.retrieve(PathBuf::from("2")).unwrap();
|
||||||
let mut e3 = store.retrieve(PathBuf::from("3")).unwrap();
|
let mut e3 = store.retrieve(PathBuf::from("3")).unwrap();
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
|
|
||||||
assert!(e1.add_internal_link(&mut e2).is_ok()); // 1-2
|
assert!(e1.add_link(&mut e2).is_ok()); // 1-2
|
||||||
assert!(e1.add_internal_link(&mut e3).is_ok()); // 1-2, 1-3
|
assert!(e1.add_link(&mut e3).is_ok()); // 1-2, 1-3
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 2);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 2);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
|
|
||||||
assert!(e2.add_internal_link(&mut e3).is_ok()); // 1-2, 1-3, 2-3
|
assert!(e2.add_link(&mut e3).is_ok()); // 1-2, 1-3, 2-3
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 2);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 2);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 2);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 2);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 2);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 2);
|
||||||
|
|
||||||
assert!(e1.remove_internal_link(&mut e2).is_ok()); // 1-3, 2-3
|
assert!(e1.remove_link(&mut e2).is_ok()); // 1-3, 2-3
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 2);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 2);
|
||||||
|
|
||||||
assert!(e1.remove_internal_link(&mut e3).is_ok()); // 2-3
|
assert!(e1.remove_link(&mut e3).is_ok()); // 2-3
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 1);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 1);
|
||||||
|
|
||||||
assert!(e2.remove_internal_link(&mut e3).is_ok());
|
assert!(e2.remove_link(&mut e3).is_ok());
|
||||||
|
|
||||||
assert_eq!(e1.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e1.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e2.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e2.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
assert_eq!(e3.get_internal_links().unwrap().collect::<Vec<_>>().len(), 0);
|
assert_eq!(e3.links().unwrap().collect::<Vec<_>>().len(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -471,11 +471,11 @@ mod test {
|
||||||
let mut entry1 = store.create(PathBuf::from("test_link_annotating-1")).unwrap();
|
let mut entry1 = store.create(PathBuf::from("test_link_annotating-1")).unwrap();
|
||||||
let mut entry2 = store.create(PathBuf::from("test_link_annotating-2")).unwrap();
|
let mut entry2 = store.create(PathBuf::from("test_link_annotating-2")).unwrap();
|
||||||
|
|
||||||
let res = entry1.add_internal_annotated_link(&mut entry2, String::from("annotation"));
|
let res = entry1.add_annotated_link(&mut entry2, String::from("annotation"));
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
|
|
||||||
{
|
{
|
||||||
for link in entry1.get_internal_links().unwrap() {
|
for link in entry1.links().unwrap() {
|
||||||
match link {
|
match link {
|
||||||
Link::Annotated {annotation, ..} => assert_eq!(annotation, "annotation"),
|
Link::Annotated {annotation, ..} => assert_eq!(annotation, "annotation"),
|
||||||
_ => assert!(false, "Non-annotated link found"),
|
_ => assert!(false, "Non-annotated link found"),
|
||||||
|
@ -484,7 +484,7 @@ mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
for link in entry2.get_internal_links().unwrap() {
|
for link in entry2.links().unwrap() {
|
||||||
match link {
|
match link {
|
||||||
Link::Id {..} => {},
|
Link::Id {..} => {},
|
||||||
Link::Annotated {..} => assert!(false, "Annotated link found"),
|
Link::Annotated {..} => assert!(false, "Annotated link found"),
|
|
@ -28,7 +28,7 @@ use failure::Fallible as Result;
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
use failure::err_msg;
|
use failure::err_msg;
|
||||||
|
|
||||||
use crate::linker::*;
|
use crate::linkable::*;
|
||||||
|
|
||||||
pub trait StoreLinkConsistentExt {
|
pub trait StoreLinkConsistentExt {
|
||||||
fn check_link_consistency(&self) -> Result<()>;
|
fn check_link_consistency(&self) -> Result<()>;
|
||||||
|
@ -62,7 +62,7 @@ impl StoreLinkConsistentExt for Store {
|
||||||
debug!("Checking entry = {:?}", entry.get_location());
|
debug!("Checking entry = {:?}", entry.get_location());
|
||||||
|
|
||||||
let internal_links = entry
|
let internal_links = entry
|
||||||
.get_internal_links()?
|
.links()?
|
||||||
.into_getter(store); // get the FLEs from the Store
|
.into_getter(store); // get the FLEs from the Store
|
||||||
|
|
||||||
let mut linking = Linking::default();
|
let mut linking = Linking::default();
|
||||||
|
|
|
@ -25,7 +25,7 @@ use failure::Error;
|
||||||
use crate::link::extract_links;
|
use crate::link::extract_links;
|
||||||
|
|
||||||
use libimagentryurl::linker::UrlLinker;
|
use libimagentryurl::linker::UrlLinker;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
use libimagentryref::reference::MutRef;
|
use libimagentryref::reference::MutRef;
|
||||||
use libimagentryref::reference::RefFassade;
|
use libimagentryref::reference::RefFassade;
|
||||||
use libimagentryref::hasher::sha1::Sha1Hasher;
|
use libimagentryref::hasher::sha1::Sha1Hasher;
|
||||||
|
@ -56,8 +56,8 @@ use url::Url;
|
||||||
/// There's no LinkProcessor::new() function, please use `LinkProcessor::default()`.
|
/// There's no LinkProcessor::new() function, please use `LinkProcessor::default()`.
|
||||||
///
|
///
|
||||||
pub struct LinkProcessor {
|
pub struct LinkProcessor {
|
||||||
process_internal_links: bool,
|
process_links: bool,
|
||||||
create_internal_targets: bool,
|
create_targets: bool,
|
||||||
process_urls: bool,
|
process_urls: bool,
|
||||||
process_refs: bool
|
process_refs: bool
|
||||||
}
|
}
|
||||||
|
@ -68,8 +68,8 @@ impl LinkProcessor {
|
||||||
///
|
///
|
||||||
/// Internal links are links which are simply `dirctory/file`, but not `/directory/file`, as
|
/// Internal links are links which are simply `dirctory/file`, but not `/directory/file`, as
|
||||||
/// beginning an id with `/` is discouraged in imag.
|
/// beginning an id with `/` is discouraged in imag.
|
||||||
pub fn process_internal_links(mut self, b: bool) -> Self {
|
pub fn process_links(mut self, b: bool) -> Self {
|
||||||
self.process_internal_links = b;
|
self.process_links = b;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,8 +78,8 @@ impl LinkProcessor {
|
||||||
/// If a link points to a non-existing imag entry, a `false` here will cause the processor to
|
/// If a link points to a non-existing imag entry, a `false` here will cause the processor to
|
||||||
/// return an error from `process()`. A `true` setting will create the entry and then fetch it
|
/// return an error from `process()`. A `true` setting will create the entry and then fetch it
|
||||||
/// to link it to the processed entry.
|
/// to link it to the processed entry.
|
||||||
pub fn create_internal_targets(mut self, b: bool) -> Self {
|
pub fn create_targets(mut self, b: bool) -> Self {
|
||||||
self.create_internal_targets = b;
|
self.create_targets = b;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,14 +121,14 @@ impl LinkProcessor {
|
||||||
///
|
///
|
||||||
/// # Warning
|
/// # Warning
|
||||||
///
|
///
|
||||||
/// When `LinkProcessor::create_internal_targets()` was called to set the setting to true, this
|
/// When `LinkProcessor::create_targets()` was called to set the setting to true, this
|
||||||
/// function returns all errors returned by the Store.
|
/// function returns all errors returned by the Store.
|
||||||
///
|
///
|
||||||
/// That means:
|
/// That means:
|
||||||
///
|
///
|
||||||
/// * For an internal link, the linked target is created if create_internal_targets() is true,
|
/// * For an internal link, the linked target is created if create_targets() is true,
|
||||||
/// else error
|
/// else error
|
||||||
/// * For an external link, if create_internal_targets() is true, libimagentrylink creates the
|
/// * For an external link, if create_targets() is true, libimagentrylink creates the
|
||||||
/// external link entry, else the link is ignored
|
/// external link entry, else the link is ignored
|
||||||
/// * all other cases do not create elements in the store
|
/// * all other cases do not create elements in the store
|
||||||
///
|
///
|
||||||
|
@ -139,19 +139,19 @@ impl LinkProcessor {
|
||||||
trace!("Processing {:?}", link);
|
trace!("Processing {:?}", link);
|
||||||
match LinkQualification::qualify(&link.link) {
|
match LinkQualification::qualify(&link.link) {
|
||||||
LinkQualification::InternalLink => {
|
LinkQualification::InternalLink => {
|
||||||
if !self.process_internal_links {
|
if !self.process_links {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
let id = StoreId::new(PathBuf::from(&link.link))?;
|
let id = StoreId::new(PathBuf::from(&link.link))?;
|
||||||
let mut target = if self.create_internal_targets {
|
let mut target = if self.create_targets {
|
||||||
store.retrieve(id)?
|
store.retrieve(id)?
|
||||||
} else {
|
} else {
|
||||||
store.get(id.clone())?
|
store.get(id.clone())?
|
||||||
.ok_or_else(|| Error::from(format_err!("Store get error: {}", id)))?
|
.ok_or_else(|| Error::from(format_err!("Store get error: {}", id)))?
|
||||||
};
|
};
|
||||||
|
|
||||||
let _ = entry.add_internal_link(&mut target)?;
|
let _ = entry.add_link(&mut target)?;
|
||||||
},
|
},
|
||||||
LinkQualification::ExternalLink(url) => {
|
LinkQualification::ExternalLink(url) => {
|
||||||
if !self.process_urls {
|
if !self.process_urls {
|
||||||
|
@ -212,7 +212,7 @@ impl LinkProcessor {
|
||||||
|
|
||||||
trace!("Ready processing, linking new ref entry...");
|
trace!("Ready processing, linking new ref entry...");
|
||||||
|
|
||||||
let _ = entry.add_internal_link(&mut ref_entry)?;
|
let _ = entry.add_link(&mut ref_entry)?;
|
||||||
},
|
},
|
||||||
LinkQualification::Undecidable(e) => {
|
LinkQualification::Undecidable(e) => {
|
||||||
// error
|
// error
|
||||||
|
@ -271,8 +271,8 @@ impl LinkQualification {
|
||||||
impl Default for LinkProcessor {
|
impl Default for LinkProcessor {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
LinkProcessor {
|
LinkProcessor {
|
||||||
process_internal_links: true,
|
process_links: true,
|
||||||
create_internal_targets: false,
|
create_targets: false,
|
||||||
process_urls: true,
|
process_urls: true,
|
||||||
process_refs: false
|
process_refs: false
|
||||||
}
|
}
|
||||||
|
@ -286,7 +286,7 @@ mod tests {
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
fn setup_logging() {
|
fn setup_logging() {
|
||||||
let _ = ::env_logger::try_init();
|
let _ = ::env_logger::try_init();
|
||||||
|
@ -328,8 +328,8 @@ mod tests {
|
||||||
let _ = store.create(PathBuf::from("test-2.2")).unwrap();
|
let _ = store.create(PathBuf::from("test-2.2")).unwrap();
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(true)
|
.process_links(true)
|
||||||
.create_internal_targets(false)
|
.create_targets(false)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(false);
|
.process_refs(false);
|
||||||
|
|
||||||
|
@ -337,7 +337,7 @@ mod tests {
|
||||||
assert!(result.is_ok(), "Should be Ok(()): {:?}", result);
|
assert!(result.is_ok(), "Should be Ok(()): {:?}", result);
|
||||||
|
|
||||||
{
|
{
|
||||||
let base_links = base.get_internal_links();
|
let base_links = base.links();
|
||||||
assert!(base_links.is_ok());
|
assert!(base_links.is_ok());
|
||||||
let base_links : Vec<_> = base_links.unwrap().collect();
|
let base_links : Vec<_> = base_links.unwrap().collect();
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ mod tests {
|
||||||
|
|
||||||
{
|
{
|
||||||
let link = store.get(PathBuf::from("test-2.2")).unwrap().unwrap();
|
let link = store.get(PathBuf::from("test-2.2")).unwrap().unwrap();
|
||||||
let link_links = link.get_internal_links();
|
let link_links = link.links();
|
||||||
assert!(link_links.is_ok());
|
assert!(link_links.is_ok());
|
||||||
let link_links : Vec<_> = link_links.unwrap().collect();
|
let link_links : Vec<_> = link_links.unwrap().collect();
|
||||||
|
|
||||||
|
@ -368,8 +368,8 @@ mod tests {
|
||||||
assert!(update.is_ok());
|
assert!(update.is_ok());
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(true)
|
.process_links(true)
|
||||||
.create_internal_targets(false)
|
.create_targets(false)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(false);
|
.process_refs(false);
|
||||||
|
|
||||||
|
@ -389,8 +389,8 @@ mod tests {
|
||||||
assert!(update.is_ok());
|
assert!(update.is_ok());
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(true)
|
.process_links(true)
|
||||||
.create_internal_targets(true)
|
.create_targets(true)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(false);
|
.process_refs(false);
|
||||||
|
|
||||||
|
@ -398,7 +398,7 @@ mod tests {
|
||||||
assert!(result.is_ok(), "Should be Ok(()): {:?}", result);
|
assert!(result.is_ok(), "Should be Ok(()): {:?}", result);
|
||||||
|
|
||||||
{
|
{
|
||||||
let base_links = base.get_internal_links();
|
let base_links = base.links();
|
||||||
assert!(base_links.is_ok());
|
assert!(base_links.is_ok());
|
||||||
let base_links : Vec<_> = base_links.unwrap().collect();
|
let base_links : Vec<_> = base_links.unwrap().collect();
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ mod tests {
|
||||||
|
|
||||||
{
|
{
|
||||||
let link = store.get(PathBuf::from("test-2.2")).unwrap().unwrap();
|
let link = store.get(PathBuf::from("test-2.2")).unwrap().unwrap();
|
||||||
let link_links = link.get_internal_links();
|
let link_links = link.links();
|
||||||
assert!(link_links.is_ok());
|
assert!(link_links.is_ok());
|
||||||
let link_links : Vec<_> = link_links.unwrap().collect();
|
let link_links : Vec<_> = link_links.unwrap().collect();
|
||||||
|
|
||||||
|
@ -429,8 +429,8 @@ mod tests {
|
||||||
assert!(update.is_ok());
|
assert!(update.is_ok());
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(true)
|
.process_links(true)
|
||||||
.create_internal_targets(true)
|
.create_targets(true)
|
||||||
.process_urls(true)
|
.process_urls(true)
|
||||||
.process_refs(false);
|
.process_refs(false);
|
||||||
|
|
||||||
|
@ -440,7 +440,7 @@ mod tests {
|
||||||
// The hash of "http://example.com" processed in the `libimagentrylink` way.
|
// The hash of "http://example.com" processed in the `libimagentrylink` way.
|
||||||
let expected_link = "url/external/9c17e047f58f9220a7008d4f18152fee4d111d14";
|
let expected_link = "url/external/9c17e047f58f9220a7008d4f18152fee4d111d14";
|
||||||
{
|
{
|
||||||
let base_links = base.get_internal_links();
|
let base_links = base.links();
|
||||||
assert!(base_links.is_ok());
|
assert!(base_links.is_ok());
|
||||||
let base_links : Vec<_> = base_links.unwrap().collect();
|
let base_links : Vec<_> = base_links.unwrap().collect();
|
||||||
|
|
||||||
|
@ -456,7 +456,7 @@ mod tests {
|
||||||
|
|
||||||
{
|
{
|
||||||
let link = store.get(PathBuf::from(expected_link)).unwrap().unwrap();
|
let link = store.get(PathBuf::from(expected_link)).unwrap().unwrap();
|
||||||
let link_links = link.get_internal_links();
|
let link_links = link.links();
|
||||||
assert!(link_links.is_ok());
|
assert!(link_links.is_ok());
|
||||||
let link_links : Vec<_> = link_links.unwrap().collect();
|
let link_links : Vec<_> = link_links.unwrap().collect();
|
||||||
|
|
||||||
|
@ -479,8 +479,8 @@ mod tests {
|
||||||
assert!(update.is_ok());
|
assert!(update.is_ok());
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(false)
|
.process_links(false)
|
||||||
.create_internal_targets(false)
|
.create_targets(false)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(true);
|
.process_refs(true);
|
||||||
|
|
||||||
|
@ -512,8 +512,8 @@ mod tests {
|
||||||
assert!(update.is_ok());
|
assert!(update.is_ok());
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(false)
|
.process_links(false)
|
||||||
.create_internal_targets(false)
|
.create_targets(false)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(true);
|
.process_refs(true);
|
||||||
|
|
||||||
|
@ -545,8 +545,8 @@ mod tests {
|
||||||
assert!(update.is_ok());
|
assert!(update.is_ok());
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(false)
|
.process_links(false)
|
||||||
.create_internal_targets(false)
|
.create_targets(false)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(false);
|
.process_refs(false);
|
||||||
|
|
||||||
|
@ -573,8 +573,8 @@ mod tests {
|
||||||
assert!(update.is_ok());
|
assert!(update.is_ok());
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(true)
|
.process_links(true)
|
||||||
.create_internal_targets(true)
|
.create_targets(true)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(false);
|
.process_refs(false);
|
||||||
|
|
||||||
|
@ -589,7 +589,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_process_one_existing_file_linked_with_internal_processing_switched_off() {
|
fn test_process_one_existing_file_linked_with_processing_switched_off() {
|
||||||
setup_logging();
|
setup_logging();
|
||||||
let store = get_store();
|
let store = get_store();
|
||||||
|
|
||||||
|
@ -603,8 +603,8 @@ mod tests {
|
||||||
let _ = store.create(PathBuf::from("test-2.2")).unwrap();
|
let _ = store.create(PathBuf::from("test-2.2")).unwrap();
|
||||||
|
|
||||||
let processor = LinkProcessor::default()
|
let processor = LinkProcessor::default()
|
||||||
.process_internal_links(false)
|
.process_links(false)
|
||||||
.create_internal_targets(false)
|
.create_targets(false)
|
||||||
.process_urls(false)
|
.process_urls(false)
|
||||||
.process_refs(false);
|
.process_refs(false);
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ impl Iterator for ExternalFilterIter {
|
||||||
/// # See also
|
/// # See also
|
||||||
///
|
///
|
||||||
/// Also see `OnlyExternalIter` and `NoExternalIter` and the helper traits/functions
|
/// Also see `OnlyExternalIter` and `NoExternalIter` and the helper traits/functions
|
||||||
/// `OnlyInteralLinks`/`only_internal_links()` and `OnlyExternalLinks`/`only_urls()`.
|
/// `OnlyInteralLinks`/`only_links()` and `OnlyExternalLinks`/`only_urls()`.
|
||||||
pub trait SelectExternal {
|
pub trait SelectExternal {
|
||||||
fn select_urls(self, b: bool) -> ExternalFilterIter;
|
fn select_urls(self, b: bool) -> ExternalFilterIter;
|
||||||
}
|
}
|
||||||
|
@ -130,7 +130,7 @@ impl Iterator for NoExternalIter {
|
||||||
pub trait OnlyExternalLinks : Sized {
|
pub trait OnlyExternalLinks : Sized {
|
||||||
fn only_urls(self) -> OnlyExternalIter ;
|
fn only_urls(self) -> OnlyExternalIter ;
|
||||||
|
|
||||||
fn no_internal_links(self) -> OnlyExternalIter {
|
fn no_links(self) -> OnlyExternalIter {
|
||||||
self.only_urls()
|
self.only_urls()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,15 +142,15 @@ impl OnlyExternalLinks for LinkIter {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait OnlyInternalLinks : Sized {
|
pub trait OnlyInternalLinks : Sized {
|
||||||
fn only_internal_links(self) -> NoExternalIter;
|
fn only_links(self) -> NoExternalIter;
|
||||||
|
|
||||||
fn no_urls(self) -> NoExternalIter {
|
fn no_urls(self) -> NoExternalIter {
|
||||||
self.only_internal_links()
|
self.only_links()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OnlyInternalLinks for LinkIter {
|
impl OnlyInternalLinks for LinkIter {
|
||||||
fn only_internal_links(self) -> NoExternalIter {
|
fn only_links(self) -> NoExternalIter {
|
||||||
NoExternalIter::new(self)
|
NoExternalIter::new(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ use libimagstore::storeid::StoreId;
|
||||||
use libimagstore::store::Store;
|
use libimagstore::store::Store;
|
||||||
use libimagstore::store::Entry;
|
use libimagstore::store::Entry;
|
||||||
use libimagutil::debug_result::DebugResult;
|
use libimagutil::debug_result::DebugResult;
|
||||||
use libimagentrylink::linker::InternalLinker;
|
use libimagentrylink::linkable::Linkable;
|
||||||
|
|
||||||
use failure::Fallible as Result;
|
use failure::Fallible as Result;
|
||||||
use toml::Value;
|
use toml::Value;
|
||||||
|
@ -36,7 +36,7 @@ use hex;
|
||||||
|
|
||||||
use crate::iter::UrlIter;
|
use crate::iter::UrlIter;
|
||||||
|
|
||||||
pub trait UrlLinker : InternalLinker {
|
pub trait UrlLinker : Linkable {
|
||||||
|
|
||||||
/// Get the external links from the implementor object
|
/// Get the external links from the implementor object
|
||||||
fn get_urls<'a>(&self, store: &'a Store) -> Result<UrlIter<'a>>;
|
fn get_urls<'a>(&self, store: &'a Store) -> Result<UrlIter<'a>>;
|
||||||
|
@ -64,7 +64,7 @@ impl UrlLinker for Entry {
|
||||||
// Iterate through all internal links and filter for FileLockEntries which live in
|
// Iterate through all internal links and filter for FileLockEntries which live in
|
||||||
// /link/external/<SHA> -> load these files and get the external link from their headers,
|
// /link/external/<SHA> -> load these files and get the external link from their headers,
|
||||||
// put them into the return vector.
|
// put them into the return vector.
|
||||||
self.get_internal_links()
|
self.links()
|
||||||
.map(|iter| {
|
.map(|iter| {
|
||||||
debug!("Getting external links");
|
debug!("Getting external links");
|
||||||
iter.only_urls().urls(store)
|
iter.only_urls().urls(store)
|
||||||
|
@ -130,7 +130,7 @@ impl UrlLinker for Entry {
|
||||||
}
|
}
|
||||||
|
|
||||||
// then add an internal link to the new file or return an error if this fails
|
// then add an internal link to the new file or return an error if this fails
|
||||||
let _ = self.add_internal_link(file.deref_mut())?;
|
let _ = self.add_link(file.deref_mut())?;
|
||||||
debug!("Added internal link");
|
debug!("Added internal link");
|
||||||
|
|
||||||
Ok((link_already_exists, file_id))
|
Ok((link_already_exists, file_id))
|
||||||
|
|
Loading…
Reference in a new issue