export module coral.files; import coral; export namespace coral { /** * [reader] that has a known range of data and may attempt to traverse it freely. */ struct file_reader : public reader { /** * Attempts to seek to the position in the file defined by `offset`, returning the literal absolute position * that was actually sought to or a [io_error] if the operation failed for whatever reason. */ virtual expected seek(u64 offset) = 0; /** * Attempts to get the current cursor position in the file, returning the literal absolute position of it or a * [io_error] if the operation failed for whatever reason. */ virtual expected tell() = 0; }; /** * Enumerates a file tree recursively, returning the absolute path of each file within. * * *Note*: file tree walking order is considered implementation-specific. */ struct file_walker : public enumerator, io_error>> { virtual ~file_walker() {} /** * See [enumerator::enumerate]. */ virtual bool enumerate() = 0; /** * Returns the last-enumerated path as a sequence of `char`s or an [io_error] if the last enumeration did not * successfully complete. */ virtual expected, io_error> value() = 0; }; /** * [writer] that has a known range of data and may attempt to traverse it freely. */ struct file_writer : public writer { /** * Attempts to seek to the position in the file defined by `offset`, returning the literal absolute position * that was actually sought to or a [io_error] if the operation failed for whatever reason. */ virtual expected seek(u64 offset) = 0; /** * Attempts to get the current cursor position in the file, returning the literal absolute position of it or a * [io_error] if the operation failed for whatever reason. */ virtual expected tell() = 0; }; /** * Platform-generalized file system interface. */ struct file_system { /** * Errors that may occur during a file system query operation. * * [query_error::unsupported] occurs when either part or all of the query operation is not supported on the * given file system. * * [query_error::io_unavailable] is a general catch-all to report that an implementation-specific I/O error has * occured and the operation could not proceed as a result. */ enum class query_error { unsupported, io_unavailable, }; /** * Various meta-information about a file in a file system. */ struct file_info { u64 size; }; virtual ~file_system() {}; /** * Attempts to query a file in the file system located at `path`, returning a [file_info] describing it or a * [query_error] if the operation failed. */ virtual expected query_file(slice const & path) { return query_error::unsupported; } /** * Attempts to read a file in the file system located at `path`, calling `then` if it was successfully opened * for reading and passing the [file_reader] context along. * * See [file_reader] for more information on how to read from the file. */ virtual void read_file(slice const & path, closure const & then) {} /** * Attempts to walk the file tree from `path`, calling `then` if it was successfully opened for walking and * passing the [file_walker] context along. * * See [file_walker] for more information on how to traverse the file tree. */ virtual void walk_files(slice const & path, closure const & then) {} /** * Attempts to write a file in the file system located at `path`, calling `then` if it was successfully created * and / or opened for writing and passing the [file_writer] context along. * * See [file_writer] for more information on how to write to the file. * * *Note*: Any file already existing at `path` will be overwritten to create a new file for writing. */ virtual void write_file(slice const & path, closure const & then) {} }; }