mmzk-env 0.1.1.1 → 0.1.2.0
raw patch · 4 files changed
+35/−1 lines, 4 filesdep +textPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: text
API changes (from Hackage documentation)
- Data.Env.EnumParser: instance (GHC.Enum.Enum a, GHC.Show.Show a, GHC.Enum.Bounded a) => Data.Env.TypeParser.TypeParser (Data.Env.EnumParser.EnumParser a)
- Data.Env.EnumParser: instance GHC.Show.Show a => GHC.Show.Show (Data.Env.EnumParser.EnumParser a)
- Data.Env.ExtractFields: instance (GHC.Generics.Generic a, Data.Env.ExtractFields.GExtractFields (GHC.Generics.Rep a)) => Data.Env.ExtractFields.ExtractFields a
- Data.Env.ExtractFields: instance GHC.Generics.Selector s => Data.Env.ExtractFields.GExtractFields (GHC.Generics.M1 GHC.Generics.S s (GHC.Generics.K1 i a))
- Data.Env.ExtractFields: instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Data.Env.ExtractFields.GExtractFields f => Data.Env.ExtractFields.GExtractFields (GHC.Generics.M1 GHC.Generics.C c f)
- Data.Env.ExtractFields: instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Data.Env.ExtractFields.GExtractFields f => Data.Env.ExtractFields.GExtractFields (GHC.Generics.M1 GHC.Generics.D c f)
- Data.Env.ExtractFields: instance forall k (f :: k -> *) (g :: k -> *). (Data.Env.ExtractFields.GExtractFields f, Data.Env.ExtractFields.GExtractFields g) => Data.Env.ExtractFields.GExtractFields (f GHC.Generics.:*: g)
- Data.Env.RecordParser: instance (Data.Env.TypeParser.TypeParser a, GHC.Generics.Selector s) => Data.Env.RecordParser.GRecordParser (GHC.Generics.M1 GHC.Generics.S s (GHC.Generics.K1 i a))
- Data.Env.RecordParser: instance (GHC.Generics.Generic a, Data.Env.RecordParser.GRecordParser (GHC.Generics.Rep a)) => Data.Env.RecordParser.RecordParser a
- Data.Env.RecordParser: instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Data.Env.RecordParser.GRecordParser f => Data.Env.RecordParser.GRecordParser (GHC.Generics.M1 GHC.Generics.C c f)
- Data.Env.RecordParser: instance forall k (f :: k -> *) (c :: GHC.Generics.Meta). Data.Env.RecordParser.GRecordParser f => Data.Env.RecordParser.GRecordParser (GHC.Generics.M1 GHC.Generics.D c f)
- Data.Env.RecordParser: instance forall k (f :: k -> *) (g :: k -> *). (Data.Env.RecordParser.GRecordParser f, Data.Env.RecordParser.GRecordParser g) => Data.Env.RecordParser.GRecordParser (f GHC.Generics.:*: g)
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Base.String
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Int.Int16
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Int.Int32
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Int.Int64
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Int.Int8
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Word.Word16
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Word.Word32
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Word.Word64
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Word.Word8
- Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser a => Data.Env.TypeParser.TypeParser (GHC.Maybe.Maybe a)
+ Data.Env.EnumParser: instance (GHC.Internal.Enum.Enum a, GHC.Internal.Show.Show a, GHC.Internal.Enum.Bounded a) => Data.Env.TypeParser.TypeParser (Data.Env.EnumParser.EnumParser a)
+ Data.Env.EnumParser: instance GHC.Internal.Show.Show a => GHC.Internal.Show.Show (Data.Env.EnumParser.EnumParser a)
+ Data.Env.ExtractFields: instance (GHC.Internal.Generics.Generic a, Data.Env.ExtractFields.GExtractFields (GHC.Internal.Generics.Rep a)) => Data.Env.ExtractFields.ExtractFields a
+ Data.Env.ExtractFields: instance GHC.Internal.Generics.Selector s => Data.Env.ExtractFields.GExtractFields (GHC.Internal.Generics.M1 GHC.Internal.Generics.S s (GHC.Internal.Generics.K1 i a))
+ Data.Env.ExtractFields: instance forall k (f :: k -> *) (c :: GHC.Internal.Generics.Meta). Data.Env.ExtractFields.GExtractFields f => Data.Env.ExtractFields.GExtractFields (GHC.Internal.Generics.M1 GHC.Internal.Generics.C c f)
+ Data.Env.ExtractFields: instance forall k (f :: k -> *) (c :: GHC.Internal.Generics.Meta). Data.Env.ExtractFields.GExtractFields f => Data.Env.ExtractFields.GExtractFields (GHC.Internal.Generics.M1 GHC.Internal.Generics.D c f)
+ Data.Env.ExtractFields: instance forall k (f :: k -> *) (g :: k -> *). (Data.Env.ExtractFields.GExtractFields f, Data.Env.ExtractFields.GExtractFields g) => Data.Env.ExtractFields.GExtractFields (f GHC.Internal.Generics.:*: g)
+ Data.Env.RecordParser: instance (Data.Env.TypeParser.TypeParser a, GHC.Internal.Generics.Selector s) => Data.Env.RecordParser.GRecordParser (GHC.Internal.Generics.M1 GHC.Internal.Generics.S s (GHC.Internal.Generics.K1 i a))
+ Data.Env.RecordParser: instance (GHC.Internal.Generics.Generic a, Data.Env.RecordParser.GRecordParser (GHC.Internal.Generics.Rep a)) => Data.Env.RecordParser.RecordParser a
+ Data.Env.RecordParser: instance forall k (f :: k -> *) (c :: GHC.Internal.Generics.Meta). Data.Env.RecordParser.GRecordParser f => Data.Env.RecordParser.GRecordParser (GHC.Internal.Generics.M1 GHC.Internal.Generics.C c f)
+ Data.Env.RecordParser: instance forall k (f :: k -> *) (c :: GHC.Internal.Generics.Meta). Data.Env.RecordParser.GRecordParser f => Data.Env.RecordParser.GRecordParser (GHC.Internal.Generics.M1 GHC.Internal.Generics.D c f)
+ Data.Env.RecordParser: instance forall k (f :: k -> *) (g :: k -> *). (Data.Env.RecordParser.GRecordParser f, Data.Env.RecordParser.GRecordParser g) => Data.Env.RecordParser.GRecordParser (f GHC.Internal.Generics.:*: g)
+ Data.Env.TypeParser: ($dmparseType) :: (TypeParser a, Generic a, GTypeParser (Rep a)) => String -> Either String a
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser Data.Text.Internal.Lazy.Text
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser Data.Text.Internal.Text
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Base.String
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Int.Int16
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Int.Int32
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Int.Int64
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Int.Int8
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Word.Word16
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Word.Word32
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Word.Word64
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser GHC.Internal.Word.Word8
+ Data.Env.TypeParser: instance Data.Env.TypeParser.TypeParser a => Data.Env.TypeParser.TypeParser (GHC.Internal.Maybe.Maybe a)
- Data.Env.ExtractFields: class ExtractFields a
+ Data.Env.ExtractFields: class ExtractFields (a :: k)
- Data.Env.ExtractFields: extractFields :: forall a. ExtractFields a => [String]
+ Data.Env.ExtractFields: extractFields :: forall {k} (a :: k). ExtractFields a => [String]
- Data.Env.ExtractFields: getEnvRaw :: forall a m. (MonadIO m, ExtractFields a) => (String -> String) -> m (Map String String)
+ Data.Env.ExtractFields: getEnvRaw :: forall {k} (a :: k) m. (MonadIO m, ExtractFields a) => (String -> String) -> m (Map String String)
- Data.Env.ExtractFields: getEnvRawCamelCaseToUpperSnake :: forall a m. (MonadIO m, ExtractFields a) => m (Map String String)
+ Data.Env.ExtractFields: getEnvRawCamelCaseToUpperSnake :: forall {k} (a :: k) m. (MonadIO m, ExtractFields a) => m (Map String String)
- Data.Env.ExtractFields: getEnvRawLowerToUpperSnake :: forall a m. (MonadIO m, ExtractFields a) => m (Map String String)
+ Data.Env.ExtractFields: getEnvRawLowerToUpperSnake :: forall {k} (a :: k) m. (MonadIO m, ExtractFields a) => m (Map String String)
- Data.Env.TypeParser: parseType :: (TypeParser a, Generic a, GTypeParser (Rep a)) => String -> Either String a
+ Data.Env.TypeParser: parseType :: TypeParser a => String -> Either String a
Files
- CHANGELOG.md +6/−0
- mmzk-env.cabal +3/−1
- src/Data/Env/TypeParser.hs +14/−0
- test/Spec.hs +12/−0
CHANGELOG.md view
@@ -1,5 +1,11 @@ # Revision history for mmzk-env ++## 0.1.2.0 -- 2025-11-16++* Add spport for parsing `Text`.++ ## 0.1.1.1 -- 2025-09-29 * Fix typo in the cabal file.
mmzk-env.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: mmzk-env-version: 0.1.1.1+version: 0.1.2.0 synopsis: Read environment variables into a user-defined data type description:@@ -56,6 +56,7 @@ base >=4.16 && <5, containers >= 0.6.7 && < 0.7, gigaparsec ^>=0.3.1,+ text >= 2.1.3 && < 2.2, hs-source-dirs: src @@ -74,6 +75,7 @@ containers, gigaparsec, hspec ^>=2.11,+ text, hs-source-dirs: src test
src/Data/Env/TypeParser.hs view
@@ -14,6 +14,8 @@ ) where import Data.Int (Int8, Int16, Int32, Int64)+import qualified Data.Text as T+import qualified Data.Text.Lazy as TL import Data.Word (Word8, Word16, Word32, Word64) import GHC.Generics import qualified Text.Gigaparsec as P@@ -126,6 +128,18 @@ instance TypeParser Word64 where parseType :: String -> Either String Word64 parseType = parse (L.decimal64 naturalParser)+ {-# INLINE parseType #-}++-- | Required strict @Text@ field (parsed from String)+instance TypeParser T.Text where+ parseType :: String -> Either String T.Text+ parseType = fmap T.pack . parseType+ {-# INLINE parseType #-}++-- | Required lazy @Text@ field (parsed from String)+instance TypeParser TL.Text where+ parseType :: String -> Either String TL.Text+ parseType = fmap TL.pack . parseType {-# INLINE parseType #-} -- | Required @()@ field (parsed from String).
test/Spec.hs view
@@ -4,6 +4,8 @@ import Data.Env.TypeParser import Data.Int (Int8, Int16, Int32, Int64) import qualified Data.Map as M+import qualified Data.Text as T+import qualified Data.Text.Lazy as TL import Data.Word (Word8, Word16, Word32, Word64) import GHC.Generics import Test.Hspec@@ -20,6 +22,16 @@ parseType @String "hello" `shouldBe` Right "hello" it "does not parse empty string" do parseType @String "" `shouldSatisfy` isLeft+ describe "parse strict Text" do+ it "parses non-empty string" do+ parseType @T.Text "hello" `shouldBe` Right "hello"+ it "does not parse empty string" do+ parseType @T.Text "" `shouldSatisfy` isLeft+ describe "parse lazy Text" do+ it "parses non-empty string" do+ parseType @TL.Text "hello" `shouldBe` Right "hello"+ it "does not parse empty string" do+ parseType @TL.Text "" `shouldSatisfy` isLeft describe "parse Bool" do it "parses True" do parseType @Bool "True" `shouldBe` Right True