wireform-derive-0.1.0.0: src/Wireform/Derive/Backend.hs
-- | Identifier for a serialization backend.
--
-- A 'Backend' is a textual tag attached to per-backend modifier overrides
-- (e.g. @forBackend backendProto (rename "n")@) and consulted by each
-- per-format deriver to decide which modifiers apply.
--
-- New backends can be defined by downstream packages: just construct a
-- 'Backend' with a fresh identifier. The set of \"standard\" backends
-- defined here is open-ended and exists only as a convenience so that
-- common cases compose cleanly.
module Wireform.Derive.Backend
( Backend (..)
-- * Standard backends
, backendProto
, backendCBOR
, backendMsgPack
, backendThrift
, backendJSON
, backendEDN
, backendTOML
, backendYAML
, backendXML
, backendHTML
, backendCSV
, backendNDJSON
, backendBinary
, backendTextFormat
-- * Schema-driven backends
, backendASN1
, backendAvro
, backendBond
, backendFlatBuffers
, backendCapnProto
-- * Document / object stores
, backendBSON
, backendBencode
, backendION
-- * Cross-language object serialization
, backendFory
-- * Columnar / tabular
, backendArrow
, backendParquet
, backendOrc
, backendIceberg
) where
import Control.DeepSeq (NFData)
import Data.Data (Data)
import Data.Hashable (Hashable)
import Data.String (IsString)
import Data.Text (Text)
import GHC.Generics (Generic)
-- | Open identifier for a serialization backend.
--
-- 'Backend' has an 'IsString' instance, so backends can be written
-- inline as string literals, e.g. @forBackend "proto" (rename "n")@.
-- Prefer the named constants below where they exist so that typos are
-- caught at compile time.
newtype Backend = Backend { unBackend :: Text }
deriving stock (Eq, Ord, Show, Data, Generic)
deriving newtype (IsString, Hashable, NFData)
-- | Protocol Buffers wire encoding.
backendProto :: Backend
backendProto = Backend "proto"
-- | RFC 8949 CBOR.
backendCBOR :: Backend
backendCBOR = Backend "cbor"
-- | MessagePack.
backendMsgPack :: Backend
backendMsgPack = Backend "msgpack"
-- | Apache Thrift binary protocol.
backendThrift :: Backend
backendThrift = Backend "thrift"
-- | JSON (used by both Aeson-style and Proto3 JSON mappings;
-- Proto-JSON-specific overrides should additionally tag with
-- 'backendProto').
backendJSON :: Backend
backendJSON = Backend "json"
-- | Extensible Data Notation (Clojure / EDN).
backendEDN :: Backend
backendEDN = Backend "edn"
-- | TOML.
backendTOML :: Backend
backendTOML = Backend "toml"
-- | YAML.
backendYAML :: Backend
backendYAML = Backend "yaml"
-- | XML.
backendXML :: Backend
backendXML = Backend "xml"
-- | CSV / TSV header rows.
backendCSV :: Backend
backendCSV = Backend "csv"
-- | HTML serialization (sub-vocabulary of XML; element/attribute split).
backendHTML :: Backend
backendHTML = Backend "html"
-- | Newline-delimited JSON. One record per line.
backendNDJSON :: Backend
backendNDJSON = Backend "ndjson"
-- | Catch-all for hand-rolled binary formats that do not fit one of the
-- standard backends above.
backendBinary :: Backend
backendBinary = Backend "binary"
-- | Protobuf text format (@google.protobuf.TextFormat@ / @pbtxt@).
backendTextFormat :: Backend
backendTextFormat = Backend "textformat"
-- ---------------------------------------------------------------------------
-- Schema-driven binary formats
-- ---------------------------------------------------------------------------
-- | ASN.1 BER / DER / PER family.
backendASN1 :: Backend
backendASN1 = Backend "asn1"
-- | Apache Avro.
backendAvro :: Backend
backendAvro = Backend "avro"
-- | Microsoft Bond.
backendBond :: Backend
backendBond = Backend "bond"
-- | FlatBuffers.
backendFlatBuffers :: Backend
backendFlatBuffers = Backend "flatbuffers"
-- | Cap\'n Proto.
backendCapnProto :: Backend
backendCapnProto = Backend "capnproto"
-- ---------------------------------------------------------------------------
-- Document / object stores
-- ---------------------------------------------------------------------------
-- | BSON (MongoDB binary JSON).
backendBSON :: Backend
backendBSON = Backend "bson"
-- | BitTorrent's Bencode.
backendBencode :: Backend
backendBencode = Backend "bencode"
-- | Amazon ION (rich-typed JSON superset).
backendION :: Backend
backendION = Backend "ion"
-- ---------------------------------------------------------------------------
-- Cross-language object serialization
-- ---------------------------------------------------------------------------
-- | Apache Fory (formerly Fury) xlang serialization. Field names
-- are converted to @snake_case@ before being written as the
-- spec\'s meta-string field name.
backendFory :: Backend
backendFory = Backend "fory"
-- ---------------------------------------------------------------------------
-- Columnar / tabular
-- ---------------------------------------------------------------------------
-- | Apache Arrow in-memory columnar layout.
backendArrow :: Backend
backendArrow = Backend "arrow"
-- | Apache Parquet.
backendParquet :: Backend
backendParquet = Backend "parquet"
-- | Apache ORC.
backendOrc :: Backend
backendOrc = Backend "orc"
-- | Apache Iceberg table format.
backendIceberg :: Backend
backendIceberg = Backend "iceberg"