use std::cmp::PartialEq;
use std::convert::{AsRef, From};
use std::iter::{FromIterator, IntoIterator};
use std::path::{Path as StdPath, PathBuf as StdPathBuf};
#[derive(Clone, Debug)]
pub struct PathBuf
{
path_buf: StdPathBuf,
pub is_dir: bool,
}
impl PathBuf
{
pub fn to_str<'a>(&'a self) -> Option<&'a str>
{
self.path_buf.to_str()
}
pub fn clear(&mut self)
{
self.path_buf.clear()
}
pub fn is_dir(&self) -> bool
{
self.is_dir
}
pub fn join<P: AsRef<StdPath>>(&self, path: P) -> StdPathBuf
{
self.path_buf.join(path)
}
pub fn push<P>(&mut self, path: P)
where P: AsRef<StdPath>
{
self.path_buf.push(path)
}
}
impl From<String> for PathBuf
{
fn from(path: String) -> Self
{
PathBuf {
path_buf: StdPathBuf::from(path),
is_dir: true,
}
}
}
impl AsRef<StdPath> for PathBuf
{
fn as_ref(&self) -> &StdPath
{
self.path_buf.as_ref()
}
}
impl<P> FromIterator<P> for PathBuf
where P: AsRef<StdPath>
{
fn from_iter<T>(iter: T) -> Self
where T: IntoIterator<Item = P>
{
PathBuf {
path_buf: StdPathBuf::from_iter(iter),
is_dir: true,
}
}
}
impl PartialEq for PathBuf
{
fn eq(&self, other: &Self) -> bool
{
self.path_buf == other.path_buf
}
}
mod tests {
use super::*;
#[test]
fn test_struct_path_buf()
{
let path_str = "test_dir";
let path_str_2 = "test_dir";
let mut path_buf = PathBuf::from(String::from(path_str));
assert_eq!(path_buf.to_str(), Some(path_str));
path_buf.is_dir = false;
assert_eq!(path_buf.is_dir(), false);
path_buf.is_dir = true;
assert_eq!(path_buf.is_dir(), true);
let _ref_std_path: &StdPath = path_buf.as_ref();
let _joined_std_path = path_buf.join(path_str_2);
println!("path_buf = {:?}.", path_buf);
path_buf.clear();
}
}