use std::{fmt, str::FromStr};
use super::{DirectoryEntryHeader, ExtraAttributes, ExtraMeta};
use crate::Result;
#[derive(Clone)]
pub struct Symlink {
pub(crate) header: DirectoryEntryHeader,
pub identifier: String,
pub version: u16,
pub(super) ext: ExtraMeta,
}
impl fmt::Debug for Symlink {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.debug_struct("Symlink")
.field("header", &self.header)
.field("identifier", &self.identifier)
.field("version", &self.version)
.field("ext", &self.ext)
.finish()
}
}
impl ExtraAttributes for Symlink {
fn ext(&self) -> &ExtraMeta {
&self.ext
}
fn header(&self) -> &DirectoryEntryHeader {
&self.header
}
}
impl Symlink {
pub(crate) fn new(
header: DirectoryEntryHeader,
ext: ExtraMeta,
identifier: String,
) -> Result<Self> {
let mut identifier = match ext.alt_name.as_ref() {
Some(alt_name) => alt_name.clone(),
None => identifier,
};
let version = match identifier.rfind(';') {
Some(idx) => {
let version = u16::from_str(&identifier[idx + 1..])?;
identifier.truncate(idx);
version
}
None => 1,
};
if identifier.ends_with('.') {
identifier.pop();
}
Ok(Self {
header,
identifier,
version,
ext,
})
}
pub fn target(&self) -> Option<&String> {
self.ext.symlink_target.as_ref()
}
}