as_str() -> as_native_str()

This commit is contained in:
Damien Elmes 2021-04-18 09:33:39 +10:00
parent 1acc679e8f
commit e71f7714ad
8 changed files with 30 additions and 22 deletions

View file

@ -430,7 +430,11 @@ mod test {
} }
); );
assert_eq!( assert_eq!(
col.storage.get_deck(DeckId(123))?.unwrap().name.as_str(), col.storage
.get_deck(DeckId(123))?
.unwrap()
.name
.as_native_str(),
"recovered123" "recovered123"
); );

View file

@ -105,7 +105,7 @@ impl Collection {
/// Returns an error if a DB operation fails, or if the first existing parent is a filtered deck. /// Returns an error if a DB operation fails, or if the first existing parent is a filtered deck.
fn match_or_create_parents(&mut self, deck: &mut Deck, usn: Usn) -> Result<()> { fn match_or_create_parents(&mut self, deck: &mut Deck, usn: Usn) -> Result<()> {
let child_split: Vec<_> = deck.name.components().collect(); let child_split: Vec<_> = deck.name.components().collect();
if let Some(parent_deck) = self.first_existing_parent(deck.name.as_str(), 0)? { if let Some(parent_deck) = self.first_existing_parent(deck.name.as_native_str(), 0)? {
if parent_deck.is_filtered() { if parent_deck.is_filtered() {
return Err(FilteredDeckError::MustBeLeafNode.into()); return Err(FilteredDeckError::MustBeLeafNode.into());
} }
@ -130,7 +130,7 @@ impl Collection {
} }
fn create_missing_parents(&mut self, name: &NativeDeckName, usn: Usn) -> Result<()> { fn create_missing_parents(&mut self, name: &NativeDeckName, usn: Usn) -> Result<()> {
let mut machine_name = name.as_str(); let mut machine_name = name.as_native_str();
while let Some(parent_name) = immediate_parent_name(machine_name) { while let Some(parent_name) = immediate_parent_name(machine_name) {
if self.storage.get_deck_id(parent_name)?.is_none() { if self.storage.get_deck_id(parent_name)?.is_none() {
self.add_parent_deck(parent_name, usn)?; self.add_parent_deck(parent_name, usn)?;

View file

@ -150,7 +150,7 @@ impl Collection {
pub fn get_or_create_normal_deck(&mut self, human_name: &str) -> Result<Deck> { pub fn get_or_create_normal_deck(&mut self, human_name: &str) -> Result<Deck> {
let name = NativeDeckName::from_human_name(human_name); let name = NativeDeckName::from_human_name(human_name);
if let Some(did) = self.storage.get_deck_id(name.as_str())? { if let Some(did) = self.storage.get_deck_id(name.as_native_str())? {
self.storage.get_deck(did).map(|opt| opt.unwrap()) self.storage.get_deck(did).map(|opt| opt.unwrap())
} else { } else {
let mut deck = Deck::new_normal(); let mut deck = Deck::new_normal();
@ -164,7 +164,7 @@ impl Collection {
/// use the method in storage instead. /// use the method in storage instead.
pub(crate) fn get_deck_id(&self, human_name: &str) -> Result<Option<DeckId>> { pub(crate) fn get_deck_id(&self, human_name: &str) -> Result<Option<DeckId>> {
self.storage self.storage
.get_deck_id(NativeDeckName::from_human_name(human_name).as_str()) .get_deck_id(NativeDeckName::from_human_name(human_name).as_native_str())
} }
} }
@ -248,7 +248,7 @@ mod test {
// should handle name conflicts // should handle name conflicts
middle.name = NativeDeckName::from_native_str("other"); middle.name = NativeDeckName::from_native_str("other");
col.add_or_update_deck(&mut middle)?; col.add_or_update_deck(&mut middle)?;
assert_eq!(middle.name.as_str(), "other+"); assert_eq!(middle.name.as_native_str(), "other+");
// public function takes human name // public function takes human name
col.rename_deck(middle.id, "one::two")?; col.rename_deck(middle.id, "one::two")?;

View file

@ -8,10 +8,7 @@ use std::borrow::Cow;
pub struct NativeDeckName(String); pub struct NativeDeckName(String);
impl NativeDeckName { impl NativeDeckName {
pub fn from_native_str<N: Into<String>>(name: N) -> Self { /// Create from a '::'-separated string
NativeDeckName(name.into())
}
pub fn from_human_name(name: &str) -> Self { pub fn from_human_name(name: &str) -> Self {
NativeDeckName( NativeDeckName(
name.split("::") name.split("::")
@ -20,6 +17,7 @@ impl NativeDeckName {
) )
} }
/// Return a '::'-separated string.
pub fn human_name(&self) -> String { pub fn human_name(&self) -> String {
self.0.replace('\x1f', "::") self.0.replace('\x1f', "::")
} }
@ -28,7 +26,13 @@ impl NativeDeckName {
self.0 += suffix self.0 += suffix
} }
pub(crate) fn as_str(&self) -> &str { /// Create from an '\x1f'-separated string
pub(crate) fn from_native_str<N: Into<String>>(name: N) -> Self {
NativeDeckName(name.into())
}
/// Return a reference to the inner '\x1f'-separated string.
pub(crate) fn as_native_str(&self) -> &str {
&self.0 &self.0
} }
@ -58,7 +62,7 @@ impl NativeDeckName {
/// Replace the old parent's name with the new parent's name in self's name, where the old /// Replace the old parent's name with the new parent's name in self's name, where the old
/// parent's name is expected to be a prefix. /// parent's name is expected to be a prefix.
fn reparent(&mut self, old_parent: &NativeDeckName, new_parent: &NativeDeckName) { fn reparent(&mut self, old_parent: &NativeDeckName, new_parent: &NativeDeckName) {
self.0 = std::iter::once(new_parent.as_str()) self.0 = std::iter::once(new_parent.as_native_str())
.chain(self.components().skip(old_parent.components().count())) .chain(self.components().skip(old_parent.components().count()))
.join("\x1f") .join("\x1f")
} }
@ -117,7 +121,7 @@ impl Collection {
pub(crate) fn ensure_deck_name_unique(&self, deck: &mut Deck, usn: Usn) -> Result<()> { pub(crate) fn ensure_deck_name_unique(&self, deck: &mut Deck, usn: Usn) -> Result<()> {
loop { loop {
match self.storage.get_deck_id(deck.name.as_str())? { match self.storage.get_deck_id(deck.name.as_native_str())? {
Some(did) if did == deck.id => break, Some(did) if did == deck.id => break,
None => break, None => break,
_ => (), _ => (),

View file

@ -267,7 +267,7 @@ impl Collection {
if let Some(now) = now { if let Some(now) = now {
let limit = top_deck_id.and_then(|did| { let limit = top_deck_id.and_then(|did| {
if let Some(deck) = decks_map.get(&did) { if let Some(deck) = decks_map.get(&did) {
Some(deck.name.as_str()) Some(deck.name.as_native_str())
} else { } else {
None None
} }

View file

@ -39,7 +39,7 @@ pub(super) fn remaining_limits_capped_to_parents(
today: u32, today: u32,
) -> Vec<RemainingLimits> { ) -> Vec<RemainingLimits> {
let mut limits = get_remaining_limits(decks, config, today); let mut limits = get_remaining_limits(decks, config, today);
cap_limits_to_parents(decks.iter().map(|d| d.name.as_str()), &mut limits); cap_limits_to_parents(decks.iter().map(|d| d.name.as_native_str()), &mut limits);
limits limits
} }

View file

@ -347,11 +347,11 @@ impl SqlWriter<'_> {
.get_deck(current_did)? .get_deck(current_did)?
.map(|d| d.name) .map(|d| d.name)
.unwrap_or_else(|| NativeDeckName::from_native_str("Default")) .unwrap_or_else(|| NativeDeckName::from_native_str("Default"))
.as_str(), .as_native_str(),
) )
} else { } else {
NativeDeckName::from_human_name(&to_re(deck)) NativeDeckName::from_human_name(&to_re(deck))
.as_str() .as_native_str()
.to_string() .to_string()
}; };

View file

@ -124,7 +124,7 @@ impl SqliteStorage {
let mut kind = vec![]; let mut kind = vec![];
kind_enum.encode(&mut kind)?; kind_enum.encode(&mut kind)?;
let count = stmt.execute(params![ let count = stmt.execute(params![
deck.name.as_str(), deck.name.as_native_str(),
deck.mtime_secs, deck.mtime_secs,
deck.usn, deck.usn,
common, common,
@ -159,7 +159,7 @@ impl SqliteStorage {
kind_enum.encode(&mut kind)?; kind_enum.encode(&mut kind)?;
stmt.execute(params![ stmt.execute(params![
deck.id, deck.id,
deck.name.as_str(), deck.name.as_native_str(),
deck.mtime_secs, deck.mtime_secs,
deck.usn, deck.usn,
common, common,
@ -234,7 +234,7 @@ impl SqliteStorage {
.last() .last()
.map(|d| &d.name) .map(|d| &d.name)
.unwrap_or_else(|| &child.name) .unwrap_or_else(|| &child.name)
.as_str(), .as_native_str(),
) { ) {
if let Some(parent_did) = self.get_deck_id(parent_name)? { if let Some(parent_did) = self.get_deck_id(parent_name)? {
let parent = self.get_deck(parent_did)?.unwrap(); let parent = self.get_deck(parent_did)?.unwrap();
@ -329,7 +329,7 @@ impl SqliteStorage {
"create temporary table active_decks (id integer primary key not null);" "create temporary table active_decks (id integer primary key not null);"
))?; ))?;
let top = current.name.as_str(); let top = current.name.as_native_str();
let prefix_start = &format!("{}\x1f", top); let prefix_start = &format!("{}\x1f", top);
let prefix_end = &format!("{}\x20", top); let prefix_end = &format!("{}\x20", top);
@ -361,7 +361,7 @@ impl SqliteStorage {
deck.set_modified(usn); deck.set_modified(usn);
} }
loop { loop {
let name = UniCase::new(deck.name.as_str().to_string()); let name = UniCase::new(deck.name.as_native_str().to_string());
if !names.contains(&name) { if !names.contains(&name) {
names.insert(name); names.insert(name);
break; break;