use serde::{Deserialize, Serialize};
use std::str::FromStr;
use crate::*;
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum PrivateDir {
Data,
Cache,
NoBackupData,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum AppDir {
Data,
Cache,
#[deprecated(note = "For Android 11 (API level 30) or higher, this is deprecated. Use `PublicDir` of `PublicStorage` instead.")]
PublicMedia
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum PublicDir {
#[serde(untagged)]
Image(PublicImageDir),
#[serde(untagged)]
Video(PublicVideoDir),
#[serde(untagged)]
Audio(PublicAudioDir),
#[serde(untagged)]
GeneralPurpose(PublicGeneralPurposeDir),
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum PublicImageDir {
Pictures,
DCIM,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum PublicVideoDir {
Movies,
DCIM,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum PublicAudioDir {
Music,
Alarms,
Audiobooks,
Notifications,
Podcasts,
Ringtones,
Recordings,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum PublicGeneralPurposeDir {
Documents,
Download,
}
impl std::fmt::Display for PublicImageDir {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PublicImageDir::Pictures => write!(f, "Pictures"),
PublicImageDir::DCIM => write!(f, "DCIM"),
}
}
}
impl std::fmt::Display for PublicVideoDir {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PublicVideoDir::Movies => write!(f, "Movies"),
PublicVideoDir::DCIM => write!(f, "DCIM"),
}
}
}
impl std::fmt::Display for PublicAudioDir {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PublicAudioDir::Music => write!(f, "Music"),
PublicAudioDir::Alarms => write!(f, "Alarms"),
PublicAudioDir::Audiobooks => write!(f, "Audiobooks"),
PublicAudioDir::Notifications => write!(f, "Notifications"),
PublicAudioDir::Podcasts => write!(f, "Podcasts"),
PublicAudioDir::Ringtones => write!(f, "Ringtones"),
PublicAudioDir::Recordings => write!(f, "Recordings"),
}
}
}
impl std::fmt::Display for PublicGeneralPurposeDir {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
PublicGeneralPurposeDir::Documents => write!(f, "Documents"),
PublicGeneralPurposeDir::Download => write!(f, "Download"),
}
}
}
impl std::fmt::Display for PublicDir {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
PublicDir::Image(p) => p.fmt(f),
PublicDir::Video(p) => p.fmt(f),
PublicDir::Audio(p) => p.fmt(f),
PublicDir::GeneralPurpose(p) => p.fmt(f),
}
}
}
macro_rules! impl_into_pubdir {
($target: ident, $wrapper: ident) => {
impl From<$target> for PublicDir {
fn from(value: $target) -> Self {
Self::$wrapper(value)
}
}
};
}
impl_into_pubdir!(PublicImageDir, Image);
impl_into_pubdir!(PublicVideoDir, Video);
impl_into_pubdir!(PublicAudioDir, Audio);
impl_into_pubdir!(PublicGeneralPurposeDir, GeneralPurpose);
impl FromStr for PublicImageDir {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
if s.eq_ignore_ascii_case("pictures") {
Ok(PublicImageDir::Pictures)
}
else if s.eq_ignore_ascii_case("dcim") {
Ok(PublicImageDir::DCIM)
}
else {
Err(Error::with(format!("invalid PublicImageDir: {s}")))
}
}
}
impl FromStr for PublicVideoDir {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
if s.eq_ignore_ascii_case("movies") {
Ok(PublicVideoDir::Movies)
}
else if s.eq_ignore_ascii_case("dcim") {
Ok(PublicVideoDir::DCIM)
}
else {
Err(Error::with(format!("invalid PublicVideoDir: {s}")))
}
}
}
impl FromStr for PublicAudioDir {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
if s.eq_ignore_ascii_case("music") {
Ok(PublicAudioDir::Music)
}
else if s.eq_ignore_ascii_case("alarms") {
Ok(PublicAudioDir::Alarms)
}
else if s.eq_ignore_ascii_case("audiobooks") {
Ok(PublicAudioDir::Audiobooks)
}
else if s.eq_ignore_ascii_case("notifications") {
Ok(PublicAudioDir::Notifications)
}
else if s.eq_ignore_ascii_case("podcasts") {
Ok(PublicAudioDir::Podcasts)
}
else if s.eq_ignore_ascii_case("ringtones") {
Ok(PublicAudioDir::Ringtones)
}
else if s.eq_ignore_ascii_case("recordings") {
Ok(PublicAudioDir::Recordings)
}
else {
Err(Error::with(format!("invalid PublicAudioDir: {s}")))
}
}
}
impl FromStr for PublicGeneralPurposeDir {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
if s.eq_ignore_ascii_case("documents") {
Ok(PublicGeneralPurposeDir::Documents)
}
else if s.eq_ignore_ascii_case("download") {
Ok(PublicGeneralPurposeDir::Download)
}
else if s.eq_ignore_ascii_case("downloads") {
Ok(PublicGeneralPurposeDir::Download)
}
else {
Err(Error::with(format!("invalid PublicGeneralPurposeDir: {s}")))
}
}
}
impl FromStr for PublicDir {
type Err = Error;
fn from_str(s: &str) -> Result<Self> {
if let Ok(v) = PublicImageDir::from_str(s) {
Ok(PublicDir::Image(v))
}
else if let Ok(v) = PublicVideoDir::from_str(s) {
Ok(PublicDir::Video(v))
}
else if let Ok(v) = PublicAudioDir::from_str(s) {
Ok(PublicDir::Audio(v))
}
else if let Ok(v) = PublicGeneralPurposeDir::from_str(s) {
Ok(PublicDir::GeneralPurpose(v))
}
else {
Err(Error::with(format!("invalid PublicDir: {s}")))
}
}
}