Skip to content
Snippets Groups Projects
filesystem.rs 1015 B
Newer Older
use alloc::boxed::Box;

use super::{Disk, Header, Node};

/// A file system
pub struct FileSystem<E> {
    pub disk: Box<Disk<E>>,
    pub header: Header,
}

impl<E> FileSystem<E> {
    /// Open a file system on a disk
    pub fn open(mut disk: Box<Disk<E>>) -> Result<Option<Self>, E> {
        let mut header = Header::default();
        try!(disk.read_at(1, &mut header));
        if header.valid() {
            Ok(Some(FileSystem {
                disk: disk,
                header: header,

    /// Create a file system on a disk
    pub fn create(mut disk: Box<Disk<E>>) -> Result<Self, E> {
        let header = Header::new();
        try!(disk.write_at(1, &header));
        Ok(FileSystem {
            disk: disk,
            header: header,
        })
    }

    pub fn node(&mut self, block: u64) -> Result<Node, E> {
        let mut node = Node::default();
        try!(self.disk.read_at(block, &mut node));
        Ok(node)
    }