imdb-async 0.12.2

Opinionated and unopinionated async wrappers to efficiently retrieve and parse IMDB's dataset
Documentation
use serde::de::Error;
use serde::de::Unexpected;
use serde::Deserialize;
use serde::Deserializer;

const IMDB_ID_EXPECT: &str = "a string starting with 'tt', followed by a positive integer";

#[inline]
pub fn parse_imdb_id<'de, D: Deserializer<'de>>(deserializer: D) -> Result<u32, D::Error> {
	let s: &str = Deserialize::deserialize(deserializer)?;
	if(s.len() < 2 || &s[0..=1] != "tt") {
		return Err(Error::invalid_value(Unexpected::Str(s), &IMDB_ID_EXPECT));
	}
	match s[2..].parse() {
		Ok(v) => Ok(v),
		Err(_) => Err(Error::invalid_value(Unexpected::Str(s), &IMDB_ID_EXPECT))
	}
}

#[inline]
pub fn parse_janky_tsv_option<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Option<u16>, D::Error> {
	use core::num::IntErrorKind;

	let s: &str = Deserialize::deserialize(deserializer)?;
	if(s == "\\N") {
		return Ok(None);
	}
	match s.parse() {
		Ok(v) => Ok(Some(v)),
		Err(e) if *e.kind() == IntErrorKind::PosOverflow => Ok(None),
		Err(_) => Err(Error::invalid_type(Unexpected::Str(s), &"an unsigned 16-bit integer, or '\\N'"))
	}
}

#[inline]
pub fn parse_janky_tsv_option_u32<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Option<u32>, D::Error> {
	let s: &str = Deserialize::deserialize(deserializer)?;
	if(s == "\\N") {
		return Ok(None);
	}
	match s.parse() {
		Ok(v) => Ok(Some(v)),
		Err(_) => Err(Error::invalid_type(Unexpected::Str(s), &"an unsigned 32-bit integer, or '\\N'"))
	}
}