Packages

Pure Elixir implementation of raw Snappy block and framed Snappy stream compression.

Current section

Files

Jump to
snappyex lib snappy_ex.ex
Raw

lib/snappy_ex.ex

defmodule SnappyEx do
@moduledoc """
Public API for raw Snappy blocks.
`compress/1` and `decompress/1` work with the standard raw Snappy block
format: an uncompressed-size varint followed by literal and copy commands.
`compress_framed/1` and `decompress_framed/1` work with the Snappy framed
stream format. `compress_framed_stream/1` and `decompress_framed_stream/2`
provide lazy, bounded-memory framed processing.
"""
@type decompress_error ::
:empty_input
| :malformed_preamble
| :truncated_literal
| :truncated_copy
| :invalid_offset
| :invalid_length
| :output_limit_exceeded
@type framed_decompress_error ::
:missing_stream_identifier
| :invalid_stream_identifier
| :truncated_chunk_header
| :truncated_chunk
| :invalid_chunk_length
| :unsupported_chunk
| :checksum_mismatch
| :output_limit_exceeded
| {:invalid_compressed_chunk, decompress_error()}
@doc """
Compresses a binary into the raw Snappy block format.
"""
@spec compress(binary) :: binary
defdelegate compress(input), to: SnappyEx.Raw
@doc """
Decompresses a raw Snappy block.
Returns `{:ok, binary}` on success or `{:error, reason}` for malformed input.
## Options
* `:max_output_size` - maximum number of uncompressed bytes to return, or
`:infinity` for no limit. Defaults to `:infinity`.
"""
@spec decompress(binary, keyword) :: {:ok, binary} | {:error, decompress_error}
def decompress(compressed, opts \\ []), do: SnappyEx.Raw.decompress(compressed, opts)
@doc """
Decompresses a raw Snappy block, raising `ArgumentError` for malformed input
or output-limit violations. Accepts the same options as `decompress/2`.
"""
@spec decompress!(binary, keyword) :: binary
def decompress!(compressed, opts \\ []), do: SnappyEx.Raw.decompress!(compressed, opts)
@doc """
Compresses a binary into the Snappy framed stream format.
"""
@spec compress_framed(binary) :: binary
defdelegate compress_framed(input), to: SnappyEx.Framed, as: :compress
@doc """
Lazily compresses a binary or enumerable of iodata chunks into a Snappy framed stream.
The returned stream yields binary frame fragments and begins with the stream
identifier. Concatenating the fragments produces the same bytes as
`compress_framed/1` for the same input.
"""
@spec compress_framed_stream(binary | Enumerable.t()) :: Enumerable.t()
defdelegate compress_framed_stream(input), to: SnappyEx.Framed, as: :compress_stream
@doc """
Decompresses a Snappy framed stream.
Returns `{:ok, binary}` on success or `{:error, reason}` for malformed input.
## Options
* `:max_output_size` - maximum total number of uncompressed bytes to return,
or `:infinity` for no aggregate limit. Defaults to `:infinity`.
"""
@spec decompress_framed(binary, keyword) :: {:ok, binary} | {:error, framed_decompress_error}
def decompress_framed(compressed, opts \\ []), do: SnappyEx.Framed.decompress(compressed, opts)
@doc """
Decompresses a Snappy framed stream, raising `ArgumentError` for malformed input
or output-limit violations. Accepts the same options as `decompress_framed/2`.
"""
@spec decompress_framed!(binary, keyword) :: binary
def decompress_framed!(compressed, opts \\ []), do: SnappyEx.Framed.decompress!(compressed, opts)
@doc """
Lazily decompresses a binary or enumerable of iodata chunks containing a Snappy framed stream.
Each yielded binary is a complete checksum-verified data chunk. Input may be
split at arbitrary byte boundaries.
## Options
* `:max_output_size` - maximum total number of uncompressed bytes to yield,
or `:infinity` for no aggregate limit. Defaults to `:infinity`.
Malformed input and output-limit violations raise `ArgumentError` when the
returned stream reaches the offending chunk. Unread input is not validated.
"""
@spec decompress_framed_stream(binary | Enumerable.t(), keyword) :: Enumerable.t()
def decompress_framed_stream(input, opts \\ []), do: SnappyEx.Framed.decompress_stream(input, opts)
end