Minor fixes
This commit is contained in:
parent
2d0bdce184
commit
22549f378a
75
src/lib.rs
75
src/lib.rs
@ -31,8 +31,8 @@ pub const V0_MIN_NUMBER: u32 = 1024;
|
|||||||
#[derive(Error, Debug, Eq, PartialEq)]
|
#[derive(Error, Debug, Eq, PartialEq)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
/// The given word is not in the wordlist
|
/// The given word is not in the wordlist
|
||||||
#[error("Word does not exist: {0}")]
|
#[error("Words do not exist: {0:?}")]
|
||||||
WordDoesNotExist(String),
|
WordsDoNotExist(Vec<String>),
|
||||||
/// The encoded version bit is not supported by this version of the crate
|
/// The encoded version bit is not supported by this version of the crate
|
||||||
#[error("Unimplemented version: {0}")]
|
#[error("Unimplemented version: {0}")]
|
||||||
UnimplementedVersion(u8),
|
UnimplementedVersion(u8),
|
||||||
@ -43,7 +43,7 @@ pub enum Error {
|
|||||||
#[error("The string given is not ascii")]
|
#[error("The string given is not ascii")]
|
||||||
NonAscii,
|
NonAscii,
|
||||||
/// The number of components given to decode is incorrect
|
/// The number of components given to decode is incorrect
|
||||||
#[error("Wrong number of components")]
|
#[error("Need one number and three words")]
|
||||||
WrongComponentCount,
|
WrongComponentCount,
|
||||||
/// No number component was found
|
/// No number component was found
|
||||||
///
|
///
|
||||||
@ -58,6 +58,9 @@ pub enum Error {
|
|||||||
/// This is the case when either lat or lon is f64::NAN
|
/// This is the case when either lat or lon is f64::NAN
|
||||||
#[error("Invalid latitude or longitude")]
|
#[error("Invalid latitude or longitude")]
|
||||||
NaNLatLng,
|
NaNLatLng,
|
||||||
|
|
||||||
|
#[error("Words cannot be repeated")]
|
||||||
|
RepeatedWords,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::doc_markdown)]
|
#[allow(clippy::doc_markdown)]
|
||||||
@ -131,7 +134,6 @@ impl Address<'_> {
|
|||||||
/// This will return [`Error::NaNLatLng`] when the latitude or longitude are not valid
|
/// This will return [`Error::NaNLatLng`] when the latitude or longitude are not valid
|
||||||
///
|
///
|
||||||
/// See [`Error::NaNLatLng`] for the valid values
|
/// See [`Error::NaNLatLng`] for the valid values
|
||||||
|
|
||||||
pub fn from_lat_lon(lat: f64, lon: f64) -> Result<Self, Error> {
|
pub fn from_lat_lon(lat: f64, lon: f64) -> Result<Self, Error> {
|
||||||
let cellid = conversions::lat_lon_to_cellid(lat, lon)?;
|
let cellid = conversions::lat_lon_to_cellid(lat, lon)?;
|
||||||
|
|
||||||
@ -160,21 +162,39 @@ impl Address<'_> {
|
|||||||
return Err(Error::WrongComponentCount);
|
return Err(Error::WrongComponentCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert each word component into a word, returning an error if any do not match
|
// Check that each word exists
|
||||||
let words = TryInto::<[&'static Word; 3]>::try_into(
|
let mut errors = vec![];
|
||||||
word_components
|
let mut words = vec![];
|
||||||
.iter()
|
|
||||||
.map(|w| {
|
for word in word_components {
|
||||||
words::get_word(w).ok_or_else(|| Error::WordDoesNotExist((*w).to_string()))
|
match words::get_word(word) {
|
||||||
})
|
Some(w) => words.push(w),
|
||||||
.collect::<Result<Vec<&'static Word>, Error>>()?,
|
None => errors.push(word.to_ascii_uppercase()),
|
||||||
)
|
}
|
||||||
// This unwrap is okay because we just checked to make sure the number of word components was 3
|
}
|
||||||
.unwrap();
|
|
||||||
|
if !errors.is_empty() {
|
||||||
|
return Err(Error::WordsDoNotExist(errors));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that each word is not repeated
|
||||||
|
// TODO: This will be handled by the call to get_words_multi later
|
||||||
|
{
|
||||||
|
let mut word_numbers: Vec<u16> = words.iter().map(|w| w.number).collect();
|
||||||
|
word_numbers.sort();
|
||||||
|
let prev_len = word_numbers.len();
|
||||||
|
word_numbers.dedup();
|
||||||
|
let cur_len = word_numbers.len();
|
||||||
|
|
||||||
|
if prev_len != cur_len {
|
||||||
|
return Err(Error::RepeatedWords);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
number,
|
number,
|
||||||
words,
|
// This unwrap is okay because we just checked to make sure the number of word components was 3
|
||||||
|
words: TryInto::<[&'static Word; 3]>::try_into(words).unwrap(),
|
||||||
version: Version::V0,
|
version: Version::V0,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -202,17 +222,6 @@ impl Address<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Extracts a version number from a number
|
|
||||||
///
|
|
||||||
/// The version number is set by the two bits 11 and 12
|
|
||||||
// TODO: impl TryFrom ?
|
|
||||||
// const fn extract_version(number: Number) -> Result<Version, Error> {
|
|
||||||
// match ((number >> 10) & 0b11) as u8 {
|
|
||||||
// 0 => Ok(Version::V0),
|
|
||||||
// v => Err(Error::UnimplementedVersion(v)),
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
impl Display for Address<'_> {
|
impl Display for Address<'_> {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(
|
write!(
|
||||||
@ -243,18 +252,6 @@ mod tests {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn test_extract_version() {
|
|
||||||
// assert_eq!(extract_version(0b0000_0000_0000), 0b00);
|
|
||||||
// assert_eq!(extract_version(0b1100_0000_0000), 0b11);
|
|
||||||
// assert_eq!(extract_version(0b0100_0000_0000), 0b01);
|
|
||||||
// assert_eq!(extract_version(0b1000_0000_0000), 0b10);
|
|
||||||
// assert_eq!(extract_version(0b11 << 10), 0b11);
|
|
||||||
// assert_eq!(extract_version(0b00 << 10), 0b00);
|
|
||||||
// assert_eq!(extract_version(0b10 << 10), 0b10);
|
|
||||||
// assert_eq!(extract_version(0b01 << 10), 0b01);
|
|
||||||
// }
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_address_from_str() {
|
fn test_address_from_str() {
|
||||||
for i in &[
|
for i in &[
|
||||||
|
@ -24,9 +24,9 @@ placeholder="Enter address"></Svelecte>
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label class="block text-gray-700 text-sm font-bold mb-2" for="username"> Address </label>
|
<label class="text-gray-700 text-sm font-bold mb-2" for="username">Address</label>
|
||||||
<input
|
<input
|
||||||
class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
|
class="shadow appearance-none border rounded py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline w-96"
|
||||||
type="text"
|
type="text"
|
||||||
bind:value
|
bind:value
|
||||||
placeholder="Address"
|
placeholder="Address"
|
||||||
|
@ -105,10 +105,30 @@
|
|||||||
{#await init()}
|
{#await init()}
|
||||||
<p class="text-lg js-only">Loading WebAssembly module...</p>
|
<p class="text-lg js-only">Loading WebAssembly module...</p>
|
||||||
{:then}
|
{:then}
|
||||||
<p>Current cursor: {addr.address} ({addr.latLon}) => ({latlng.lat}, {latlng.lng})</p>
|
<p>Address: <span class="font-bold">{addr.address}</span></p>
|
||||||
|
<p class="text-sm">({addr.latLon}) => ({latlng.lat}, {latlng.lng})</p>
|
||||||
|
|
||||||
<AddressInput bind:value={addrInputValue} on:input={input} />
|
<AddressInput bind:value={addrInputValue} on:input={input} />
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<label class="text-gray-700 text-sm font-bold mb-2" for="username">Latitude</label>
|
||||||
|
<input
|
||||||
|
class="shadow appearance-none border rounded py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
|
||||||
|
disabled
|
||||||
|
type="text"
|
||||||
|
bind:value={latlng.lat}
|
||||||
|
placeholder="0.00"
|
||||||
|
/>
|
||||||
|
<label class="text-gray-700 text-sm font-bold mb-2" for="username">Longitude</label>
|
||||||
|
<input
|
||||||
|
class="shadow appearance-none border rounded py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
|
||||||
|
disabled
|
||||||
|
type="text"
|
||||||
|
bind:value={latlng.lng}
|
||||||
|
placeholder="0.00"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<Map bind:map {onMapClick} />
|
<Map bind:map {onMapClick} />
|
||||||
{:catch message}
|
{:catch message}
|
||||||
<Error {message}>Could not start core module</Error>
|
<Error {message}>Could not start core module</Error>
|
||||||
|
Loading…
Reference in New Issue
Block a user