cosmic-edit/src/project.rs

81 lines
1.9 KiB
Rust
Raw Normal View History

2023-10-27 11:43:30 -06:00
// SPDX-License-Identifier: GPL-3.0-only
2023-10-26 10:15:09 -06:00
use std::{
fs, io,
path::{Path, PathBuf},
};
2023-10-27 11:43:30 -06:00
#[derive(Clone, Debug)]
pub enum ProjectNode {
Root {
name: String,
path: PathBuf,
open: bool,
},
Folder {
name: String,
path: PathBuf,
open: bool,
},
File {
name: String,
path: PathBuf,
},
2023-10-26 10:15:09 -06:00
}
2023-10-27 11:43:30 -06:00
impl ProjectNode {
2023-10-26 10:15:09 -06:00
pub fn new<P: AsRef<Path>>(path: P) -> io::Result<Self> {
let path = fs::canonicalize(path)?;
let name = path
.file_name()
.ok_or(io::Error::new(
io::ErrorKind::Other,
2023-10-27 11:43:30 -06:00
format!("path {:?} has no file name", path),
2023-10-26 10:15:09 -06:00
))?
.to_str()
.ok_or(io::Error::new(
io::ErrorKind::Other,
2023-10-27 11:43:30 -06:00
format!("path {:?} is not valid UTF-8", path),
2023-10-26 10:15:09 -06:00
))?
.to_string();
2023-10-27 11:43:30 -06:00
Ok(if path.is_dir() {
Self::Folder {
path,
name,
open: false,
}
} else {
Self::File { path, name }
})
}
pub fn icon_name(&self) -> &str {
match self {
//TODO: different icon for project?
ProjectNode::Root { open, .. } => {
if *open {
"go-down-symbolic"
} else {
"go-next-symbolic"
}
}
ProjectNode::Folder { open, .. } => {
if *open {
"go-down-symbolic"
} else {
"go-next-symbolic"
}
}
ProjectNode::File { .. } => "text-x-generic",
}
}
pub fn name(&self) -> &str {
match self {
ProjectNode::Root { name, .. } => name,
ProjectNode::Folder { name, .. } => name,
ProjectNode::File { name, .. } => name,
}
2023-10-26 10:15:09 -06:00
}
}