# compressedfs

[![CI](https://github.com/MJKWoolnough/compressedfs/actions/workflows/go-checks.yml/badge.svg)](https://github.com/MJKWoolnough/compressedfs/actions)
[![Go Reference](https://pkg.go.dev/badge/vimagination.zapto.org/compressedfs.svg)](https://pkg.go.dev/vimagination.zapto.org/compressedfs)

--
    import "vimagination.zapto.org/compressedfs"

Package compressedfs offers a fs.FS implementation that allows compressed files to be handled as normal files.

## Highlights

 - Wrap a fs.FS to read gzip compressed files as uncompressed.
 - Readdir automatically removes .gz extensions if the uncompressed version doesn't already exist.

## Usage

```go
package main

import (
	"bytes"
	"compress/gzip"
	"fmt"
	"io/fs"
	"os"
	"testing/fstest"

	"vimagination.zapto.org/compressedfs"
)

func main() {
	var adata bytes.Buffer

	g := gzip.NewWriter(&adata)

	g.Write([]byte("Hello!"))
	g.Close()

	cfs := compressedfs.New(fstest.MapFS{
		"a.gz": &fstest.MapFile{
			Data: adata.Bytes(),
			Mode: 0755,
		},
	})

	data, err := fs.ReadFile(cfs, "a")
	if err != nil {
		fmt.Fprintln(os.Stderr, err)

		return
	}

	fmt.Println(string(data))

	// Output:
	// Hello!
}
```

## Documentation

Full API docs can be found at:

https://pkg.go.dev/vimagination.zapto.org/compressedfs
