-- | Language constraints for Protobuf v3

module Hydra.Langs.Protobuf.Language where

import qualified Hydra.Coders as Coders
import qualified Hydra.Core as Core
import qualified Hydra.Lib.Lists as Lists
import qualified Hydra.Lib.Sets as Sets
import qualified Hydra.Mantle as Mantle
import qualified Hydra.Strip as Strip
import Data.Int
import Data.List as L
import Data.Map as M
import Data.Set as S

-- | Language constraints for Protocol Buffers v3
protobufLanguage :: Coders.Language
protobufLanguage :: Language
protobufLanguage = Coders.Language {
  languageName :: LanguageName
Coders.languageName = (String -> LanguageName
Coders.LanguageName String
"hydra/langs/protobuf"),
  languageConstraints :: LanguageConstraints
Coders.languageConstraints = Coders.LanguageConstraints {
    languageConstraintsEliminationVariants :: Set EliminationVariant
Coders.languageConstraintsEliminationVariants = Set EliminationVariant
forall x. Set x
Sets.empty,
    languageConstraintsLiteralVariants :: Set LiteralVariant
Coders.languageConstraintsLiteralVariants = ([LiteralVariant] -> Set LiteralVariant
forall x. Ord x => [x] -> Set x
Sets.fromList [
      LiteralVariant
Mantle.LiteralVariantBinary,
      LiteralVariant
Mantle.LiteralVariantBoolean,
      LiteralVariant
Mantle.LiteralVariantFloat,
      LiteralVariant
Mantle.LiteralVariantInteger,
      LiteralVariant
Mantle.LiteralVariantString]),
    languageConstraintsFloatTypes :: Set FloatType
Coders.languageConstraintsFloatTypes = ([FloatType] -> Set FloatType
forall x. Ord x => [x] -> Set x
Sets.fromList [
      FloatType
Core.FloatTypeFloat32,
      FloatType
Core.FloatTypeFloat64]),
    languageConstraintsFunctionVariants :: Set FunctionVariant
Coders.languageConstraintsFunctionVariants = Set FunctionVariant
forall x. Set x
Sets.empty,
    languageConstraintsIntegerTypes :: Set IntegerType
Coders.languageConstraintsIntegerTypes = ([IntegerType] -> Set IntegerType
forall x. Ord x => [x] -> Set x
Sets.fromList [
      IntegerType
Core.IntegerTypeInt32,
      IntegerType
Core.IntegerTypeInt64,
      IntegerType
Core.IntegerTypeUint32,
      IntegerType
Core.IntegerTypeUint64]),
    languageConstraintsTermVariants :: Set TermVariant
Coders.languageConstraintsTermVariants = ([TermVariant] -> Set TermVariant
forall x. Ord x => [x] -> Set x
Sets.fromList [
      TermVariant
Mantle.TermVariantList,
      TermVariant
Mantle.TermVariantLiteral,
      TermVariant
Mantle.TermVariantMap,
      TermVariant
Mantle.TermVariantOptional,
      TermVariant
Mantle.TermVariantRecord,
      TermVariant
Mantle.TermVariantUnion]),
    languageConstraintsTypeVariants :: Set TypeVariant
Coders.languageConstraintsTypeVariants = ([TypeVariant] -> Set TypeVariant
forall x. Ord x => [x] -> Set x
Sets.fromList [
      TypeVariant
Mantle.TypeVariantAnnotated,
      TypeVariant
Mantle.TypeVariantList,
      TypeVariant
Mantle.TypeVariantLiteral,
      TypeVariant
Mantle.TypeVariantMap,
      TypeVariant
Mantle.TypeVariantOptional,
      TypeVariant
Mantle.TypeVariantRecord,
      TypeVariant
Mantle.TypeVariantUnion,
      TypeVariant
Mantle.TypeVariantVariable]),
    languageConstraintsTypes :: Type -> Bool
Coders.languageConstraintsTypes = (\Type
x -> case Type
x of
      Core.TypeMap MapType
v284 -> ((\Type
x -> case Type
x of
        Core.TypeOptional Type
_ -> Bool
False
        Type
_ -> Bool
True) (Type -> Type
Strip.stripType (MapType -> Type
Core.mapTypeValues MapType
v284)))
      Type
_ -> Bool
True)}}

-- | A set of reserved words in Protobuf
protobufReservedWords :: (Set String)
protobufReservedWords :: Set String
protobufReservedWords = ([String] -> Set String
forall x. Ord x => [x] -> Set x
Sets.fromList ([[String]] -> [String]
forall a. [[a]] -> [a]
Lists.concat [
  [String]
fieldNames])) 
  where 
    fieldNames :: [String]
fieldNames = [
      String
"case",
      String
"class",
      String
"data",
      String
"default",
      String
"deriving",
      String
"do",
      String
"else",
      String
"foreign",
      String
"if",
      String
"import",
      String
"in",
      String
"infix",
      String
"infixl",
      String
"infixr",
      String
"instance",
      String
"let",
      String
"mdo",
      String
"module",
      String
"newtype",
      String
"of",
      String
"pattern",
      String
"proc",
      String
"rec",
      String
"then",
      String
"type",
      String
"where"]