{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE GADTs             #-}
{-# LANGUAGE TypeApplications  #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- | Generated by Haskell protocol buffer compiler. DO NOT EDIT!
module TestProtoImport where
import qualified Prelude as Hs
import qualified Proto3.Suite.Class as HsProtobuf
import qualified Proto3.Suite.DotProto as HsProtobuf
import qualified Proto3.Suite.JSONPB as HsJSONPB
import Proto3.Suite.JSONPB ((.=), (.:))
import qualified Proto3.Suite.Types as HsProtobuf
import qualified Proto3.Wire as HsProtobuf
import qualified Control.Applicative as Hs
import Control.Applicative ((<*>), (<|>), (<$>))
import qualified Control.DeepSeq as Hs
import qualified Control.Monad as Hs
import qualified Data.ByteString as Hs
import qualified Data.Coerce as Hs
import qualified Data.Int as Hs (Int16, Int32, Int64)
import qualified Data.List.NonEmpty as Hs (NonEmpty(..))
import qualified Data.Map as Hs (Map, mapKeysMonotonic)
import qualified Data.Proxy as Proxy
import qualified Data.String as Hs (fromString)
import qualified Data.Text.Lazy as Hs (Text)
import qualified Data.Vector as Hs (Vector)
import qualified Data.Word as Hs (Word16, Word32, Word64)
import qualified GHC.Enum as Hs
import qualified GHC.Generics as Hs
import qualified Unsafe.Coerce as Hs
 
data WithNesting = WithNesting{withNestingNestedMessage1 ::
                               Hs.Maybe TestProtoImport.WithNesting_Nested,
                               withNestingNestedMessage2 ::
                               Hs.Maybe TestProtoImport.WithNesting_Nested}
                 deriving (Hs.Show, Hs.Eq, Hs.Ord, Hs.Generic, Hs.NFData)
 
instance HsProtobuf.Named WithNesting where
        nameOf _ = (Hs.fromString "WithNesting")
 
instance HsProtobuf.HasDefault WithNesting
 
instance HsProtobuf.Message WithNesting where
        encodeMessage _
          WithNesting{withNestingNestedMessage1 = withNestingNestedMessage1,
                      withNestingNestedMessage2 = withNestingNestedMessage2}
          = (Hs.mconcat
               [(HsProtobuf.encodeMessageField (HsProtobuf.FieldNumber 1)
                   (Hs.coerce @(Hs.Maybe TestProtoImport.WithNesting_Nested)
                      @(HsProtobuf.Nested TestProtoImport.WithNesting_Nested)
                      withNestingNestedMessage1)),
                (HsProtobuf.encodeMessageField (HsProtobuf.FieldNumber 100)
                   (Hs.coerce @(Hs.Maybe TestProtoImport.WithNesting_Nested)
                      @(HsProtobuf.Nested TestProtoImport.WithNesting_Nested)
                      withNestingNestedMessage2))])
        decodeMessage _
          = (Hs.pure WithNesting) <*>
              (Hs.coerce
                 @(_ (HsProtobuf.Nested TestProtoImport.WithNesting_Nested))
                 @(_ (Hs.Maybe TestProtoImport.WithNesting_Nested))
                 (HsProtobuf.at HsProtobuf.decodeMessageField
                    (HsProtobuf.FieldNumber 1)))
              <*>
              (Hs.coerce
                 @(_ (HsProtobuf.Nested TestProtoImport.WithNesting_Nested))
                 @(_ (Hs.Maybe TestProtoImport.WithNesting_Nested))
                 (HsProtobuf.at HsProtobuf.decodeMessageField
                    (HsProtobuf.FieldNumber 100)))
        dotProto _
          = [(HsProtobuf.DotProtoField (HsProtobuf.FieldNumber 1)
                (HsProtobuf.Prim (HsProtobuf.Named (HsProtobuf.Single "Nested")))
                (HsProtobuf.Single "nestedMessage1")
                []
                ""),
             (HsProtobuf.DotProtoField (HsProtobuf.FieldNumber 100)
                (HsProtobuf.Prim (HsProtobuf.Named (HsProtobuf.Single "Nested")))
                (HsProtobuf.Single "nestedMessage2")
                []
                "")]
 
instance HsJSONPB.ToJSONPB WithNesting where
        toJSONPB (WithNesting f1 f100)
          = (HsJSONPB.object
               ["nestedMessage1" .= f1, "nestedMessage2" .= f100])
        toEncodingPB (WithNesting f1 f100)
          = (HsJSONPB.pairs
               ["nestedMessage1" .= f1, "nestedMessage2" .= f100])
 
instance HsJSONPB.FromJSONPB WithNesting where
        parseJSONPB
          = (HsJSONPB.withObject "WithNesting"
               (\ obj ->
                  (Hs.pure WithNesting) <*> obj .: "nestedMessage1" <*>
                    obj .: "nestedMessage2"))
 
instance HsJSONPB.ToJSON WithNesting where
        toJSON = HsJSONPB.toAesonValue
        toEncoding = HsJSONPB.toAesonEncoding
 
instance HsJSONPB.FromJSON WithNesting where
        parseJSON = HsJSONPB.parseJSONPB
 
instance HsJSONPB.ToSchema WithNesting where
        declareNamedSchema _
          = do let declare_nestedMessage1 = HsJSONPB.declareSchemaRef
               withNestingNestedMessage1 <- declare_nestedMessage1 Proxy.Proxy
               let declare_nestedMessage2 = HsJSONPB.declareSchemaRef
               withNestingNestedMessage2 <- declare_nestedMessage2 Proxy.Proxy
               let _ = Hs.pure WithNesting <*>
                         HsJSONPB.asProxy declare_nestedMessage1
                         <*> HsJSONPB.asProxy declare_nestedMessage2
               Hs.return
                 (HsJSONPB.NamedSchema{HsJSONPB._namedSchemaName =
                                         Hs.Just "WithNesting",
                                       HsJSONPB._namedSchemaSchema =
                                         Hs.mempty{HsJSONPB._schemaParamSchema =
                                                     Hs.mempty{HsJSONPB._paramSchemaType =
                                                                 Hs.Just HsJSONPB.SwaggerObject},
                                                   HsJSONPB._schemaProperties =
                                                     HsJSONPB.insOrdFromList
                                                       [("nestedMessage1",
                                                         withNestingNestedMessage1),
                                                        ("nestedMessage2",
                                                         withNestingNestedMessage2)]}})
 
data WithNesting_Nested = WithNesting_Nested{withNesting_NestedNestedField1
                                             :: Hs.Int32,
                                             withNesting_NestedNestedField2 :: Hs.Int32}
                        deriving (Hs.Show, Hs.Eq, Hs.Ord, Hs.Generic, Hs.NFData)
 
instance HsProtobuf.Named WithNesting_Nested where
        nameOf _ = (Hs.fromString "WithNesting_Nested")
 
instance HsProtobuf.HasDefault WithNesting_Nested
 
instance HsProtobuf.Message WithNesting_Nested where
        encodeMessage _
          WithNesting_Nested{withNesting_NestedNestedField1 =
                               withNesting_NestedNestedField1,
                             withNesting_NestedNestedField2 = withNesting_NestedNestedField2}
          = (Hs.mconcat
               [(HsProtobuf.encodeMessageField (HsProtobuf.FieldNumber 1)
                   withNesting_NestedNestedField1),
                (HsProtobuf.encodeMessageField (HsProtobuf.FieldNumber 2)
                   withNesting_NestedNestedField2)])
        decodeMessage _
          = (Hs.pure WithNesting_Nested) <*>
              (HsProtobuf.at HsProtobuf.decodeMessageField
                 (HsProtobuf.FieldNumber 1))
              <*>
              (HsProtobuf.at HsProtobuf.decodeMessageField
                 (HsProtobuf.FieldNumber 2))
        dotProto _
          = [(HsProtobuf.DotProtoField (HsProtobuf.FieldNumber 1)
                (HsProtobuf.Prim HsProtobuf.Int32)
                (HsProtobuf.Single "nestedField1")
                []
                ""),
             (HsProtobuf.DotProtoField (HsProtobuf.FieldNumber 2)
                (HsProtobuf.Prim HsProtobuf.Int32)
                (HsProtobuf.Single "nestedField2")
                []
                "")]
 
instance HsJSONPB.ToJSONPB WithNesting_Nested where
        toJSONPB (WithNesting_Nested f1 f2)
          = (HsJSONPB.object ["nestedField1" .= f1, "nestedField2" .= f2])
        toEncodingPB (WithNesting_Nested f1 f2)
          = (HsJSONPB.pairs ["nestedField1" .= f1, "nestedField2" .= f2])
 
instance HsJSONPB.FromJSONPB WithNesting_Nested where
        parseJSONPB
          = (HsJSONPB.withObject "WithNesting_Nested"
               (\ obj ->
                  (Hs.pure WithNesting_Nested) <*> obj .: "nestedField1" <*>
                    obj .: "nestedField2"))
 
instance HsJSONPB.ToJSON WithNesting_Nested where
        toJSON = HsJSONPB.toAesonValue
        toEncoding = HsJSONPB.toAesonEncoding
 
instance HsJSONPB.FromJSON WithNesting_Nested where
        parseJSON = HsJSONPB.parseJSONPB
 
instance HsJSONPB.ToSchema WithNesting_Nested where
        declareNamedSchema _
          = do let declare_nestedField1 = HsJSONPB.declareSchemaRef
               withNesting_NestedNestedField1 <- declare_nestedField1 Proxy.Proxy
               let declare_nestedField2 = HsJSONPB.declareSchemaRef
               withNesting_NestedNestedField2 <- declare_nestedField2 Proxy.Proxy
               let _ = Hs.pure WithNesting_Nested <*>
                         HsJSONPB.asProxy declare_nestedField1
                         <*> HsJSONPB.asProxy declare_nestedField2
               Hs.return
                 (HsJSONPB.NamedSchema{HsJSONPB._namedSchemaName =
                                         Hs.Just "WithNesting_Nested",
                                       HsJSONPB._namedSchemaSchema =
                                         Hs.mempty{HsJSONPB._schemaParamSchema =
                                                     Hs.mempty{HsJSONPB._paramSchemaType =
                                                                 Hs.Just HsJSONPB.SwaggerObject},
                                                   HsJSONPB._schemaProperties =
                                                     HsJSONPB.insOrdFromList
                                                       [("nestedField1",
                                                         withNesting_NestedNestedField1),
                                                        ("nestedField2",
                                                         withNesting_NestedNestedField2)]}})