packages feed

hnix-store-remote-0.4.2.0: src/System/Nix/Store/Remote/Builders.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE TypeApplications    #-}

module System.Nix.Store.Remote.Builders
  ( buildContentAddressableAddress
  )
where

import           Data.Text.Lazy                 ( Text )
import           System.Nix.Hash                ( Digest
                                                , SomeNamedDigest(SomeDigest)
                                                , BaseEncoding(Base32)
                                                )
import           System.Nix.StorePath           ( ContentAddressableAddress(..)
                                                )

import           Data.Text.Lazy.Builder         ( Builder )
import qualified Data.Text.Lazy.Builder

import qualified System.Nix.Hash

-- | Marshall `ContentAddressableAddress` to `Text`
-- in form suitable for remote protocol usage.
buildContentAddressableAddress :: ContentAddressableAddress -> Text
buildContentAddressableAddress =
  Data.Text.Lazy.Builder.toLazyText . contentAddressableAddressBuilder

contentAddressableAddressBuilder :: ContentAddressableAddress -> Builder
contentAddressableAddressBuilder (Text digest) =
  "text:" <> digestBuilder digest
contentAddressableAddressBuilder (Fixed _narHashMode (SomeDigest (digest :: Digest hashAlgo))) =
  "fixed:"
  <> (Data.Text.Lazy.Builder.fromText $ System.Nix.Hash.algoName @hashAlgo)
  <> digestBuilder digest

digestBuilder :: Digest a -> Builder
digestBuilder =
  Data.Text.Lazy.Builder.fromText . System.Nix.Hash.encodeInBase Base32