quilt-rs 0.14.0

Rust library for accessing Quilt data packages.
Documentation
> WORK IN PROGRESS
> 
The goal of this document is to have a common understanding of the types used in
the project. It is a draft and a work in progress. Please extend and improve if possible.

# Domain

A set of namespaces, packages, and lineage
Envelope for the entire system

# Logical Domain

Rust classes for manipulating the physical domain

# Physical Domain

Actual bytes that we can read or write.

## Local Domain

A filesystem with things stored in it.

## S3 Domain

A S3 bucket with things stored in it.

## Storage

A set of logical keys

## Registry
Metadata describing the packages

### Set<Namespace>
### Set<Package>
### Lineage

## Lineage

# Filesystem Namespace

Concrete instance of a namespace on the filesystem

# Namespace

An ordered list of package revisions

## Revision

Refers to a specific package by its hash

### Tag

### Timestamp


# Package

Contains multiple files
Installing a single file from a package is a common operation

## Hash: MultiHash (from IPFS) from the multihash crate

The version of the package

## Manifest

A list of package-level metadata and a list of entries

### Header

### Entries: List<Entry>

Name: Logical key
Place: Physical key 
Hash: MultiHash
Size: usize 
Info: Dictionary containing arbitrary JSON, might be of type `Info` in the future
Meta: Json with strings for keys: {} -> JsonDict

#### Logical Key

String, which cannot be empty

#### Physical Key

A URI that can be dereferenced to get a bag of bytes
The goal is to read, hash
Intended to be read-only, but not enforced
The goal is to enforce immutability, but not versioning
On a local file-system there is no versioning







# Lineage

# PackageRef
Handle
Address for package

# PackageLineage
Latest hash
History

# Domain
Might be able to get rid of it?
Stores only root directory where lineage and any file is stored
We can just pass the root handle to every function/method

# Package Flow
Contains all meaningful operations for working with packages

## Commit
## Install
Install a package
## Make changes
## Resolve conflicts
## Push
## Pull
## Browse contents of package

# Namespace Flow
Contains all meaningful operations for working with namespaces

## Info
## Commit
## Install
Install a package
## Make changes
## Resolve conflicts
## Push
## Pull
## List all packages



# Remote

-------------------

# Missing Types

We might add the following types in the future.

## Info

Packages can have arbitrary metadata.
In order to allow for future changes, we might want to have a type that can be
extended in the future.

```rust
#[non_exhaustive]
enum Info {
    Version0(Version0),
    UnknownVersion(Json),
}

/// An example of a versioned info struct, which simply contains a message.
struct Version0 {
    message: String,
}
```

## UserMeta

Json Dictionary, which can be empty