@@ -9,11 +9,13 @@ import Data.Array (snoc)
9import Data.Foldable (foldl)
9import Data.Foldable (foldl)
10import Data.Symbol (SProxy(..))
10import Data.Symbol (SProxy(..))
11import Data.Tuple (Tuple(..))
11import Data.Tuple (Tuple(..))
12+import Data.Generic.Rep(class Generic)
13+import Data.Generic.Rep.Show (genericShow)
12import Data.Long.Unsigned (toInt)
14import Data.Long.Unsigned (toInt)
13import Data.UInt (UInt)
15import Data.UInt (UInt)
14import Data.UInt as UInt
16import Data.UInt as UInt
16−import Text.Parsing.Parser (ParserT, fail)
18+import Text.Parsing.Parser (ParserT, fail, runParserT)
17import Text.Parsing.Parser.Combinators (manyTill)
19import Text.Parsing.Parser.Combinators (manyTill)
18import Text.Parsing.Parser.DataView (eof, takeN)
20import Text.Parsing.Parser.DataView (eof, takeN)
@@ -24,11 +26,12 @@ import Protobuf.Decode as Decode
24-- import Protobuf.Encode as Encode
26-- import Protobuf.Encode as Encode
25import Protobuf.Common (WireType(..))
27import Protobuf.Common (WireType(..))
27−import Node.Process (stdin, stdout)
29+import Node.Process (stdin, stdout, stderr)
28import Node.Stream (read, writeString, onReadable)
30import Node.Stream (read, writeString, onReadable)
29import Node.Buffer (toArrayBuffer)
31import Node.Buffer (toArrayBuffer)
30import Node.Encoding (Encoding(..))
32import Node.Encoding (Encoding(..))
31−import Data.ArrayBuffer.ArrayBuffer as AB
33+-- import Data.ArrayBuffer.ArrayBuffer as AB
34+import Data.ArrayBuffer.DataView as DV
32import Data.ArrayBuffer.Types (DataView)
35import Data.ArrayBuffer.Types (DataView)
34main :: Effect Unit
37main :: Effect Unit
@@ -39,31 +42,34 @@ main = do
39 Nothing -> pure unit
42 Nothing -> pure unit
40 Just stdinbuf -> do
43 Just stdinbuf -> do
41 stdinab <- toArrayBuffer stdinbuf
44 stdinab <- toArrayBuffer stdinbuf
42− void $ writeString stdout UTF8 (show $ AB.byteLength stdinab) (pure unit)
45+ -- void $ writeString stdout UTF8 (show $ AB.byteLength stdinab) (pure unit)
46+ let stdinview = DV.whole stdinab
47+ request <- runParserT stdinview parseCodeGeneratorRequest
48+ void $ writeString stderr UTF8 (show request) (pure unit)
44−type CodeGeneratorRequestBuilder = RecordB.Builder CodeGeneratorRequestRow CodeGeneratorRequestRow
50+type CodeGeneratorRequestBuilder = RecordB.Builder CodeGeneratorRequestR CodeGeneratorRequestR
46−parseCodeGeneratorRequest :: ParserT DataView Effect CodeGeneratorRequestRow
52+parseCodeGeneratorRequest :: ParserT DataView Effect CodeGeneratorRequest
47parseCodeGeneratorRequest = do
53parseCodeGeneratorRequest = do
48 builders <- manyTill parseField eof
54 builders <- manyTill parseField eof
49− pure $ build (foldl (>>>) identity builders) defaultCodeGeneratorRequest
55+ pure $ CodeGeneratorRequest $ build (foldl (>>>) identity builders) defaultCodeGeneratorRequest
51 parseField :: ParserT DataView Effect CodeGeneratorRequestBuilder
57 parseField :: ParserT DataView Effect CodeGeneratorRequestBuilder
52 parseField = do
58 parseField = do
53 Tuple fieldNumber wireType <- Decode.tag32
59 Tuple fieldNumber wireType <- Decode.tag32
54 case unit of
60 case unit of
55− _ | fieldNumber == fn_CodeGeneratorRequestRow_file_to_generate -> do
61+ _ | fieldNumber == fn_CodeGeneratorRequest_file_to_generate -> do
56 x <- Decode.string
62 x <- Decode.string
57− pure $ modify fs_CodeGeneratorRequestRow_file_to_generate $ flip snoc x
63+ pure $ modify fs_CodeGeneratorRequest_file_to_generate $ flip snoc x
58− | fieldNumber == fn_CodeGeneratorRequestRow_parameter -> do
64+ | fieldNumber == fn_CodeGeneratorRequest_parameter -> do
59 x <- Decode.string
65 x <- Decode.string
60− pure $ modify fs_CodeGeneratorRequestRow_parameter $ const $ Just x
66+ pure $ modify fs_CodeGeneratorRequest_parameter $ const $ Just x
61− -- | fieldNumber == fn_CodeGeneratorRequestRow_proto_file -> do
67+ -- | fieldNumber == fn_CodeGeneratorRequest_proto_file -> do
62 -- x <- parseFileDescriptorProto
68 -- x <- parseFileDescriptorProto
63− -- pure $ modify fs_CodeGeneratorRequestRow_proto_file $ flip snoc x
69+ -- pure $ modify fs_CodeGeneratorRequest_proto_file $ flip snoc x
64− -- | fieldNumber == fn_CodeGeneratorRequestRow_compiler_version -> do
70+ -- | fieldNumber == fn_CodeGeneratorRequest_compiler_version -> do
65 -- x <- parseVersion
71 -- x <- parseVersion
66− -- pure $ modify fs_CodeGeneratorRequestRow_compiler_version $ const $ Just x
72+ -- pure $ modify fs_CodeGeneratorRequest_compiler_version $ const $ Just x
67 _ -> parseUnknownField wireType *> pure identity
73 _ -> parseUnknownField wireType *> pure identity
69 -- IMPORTANT For embedded message fields, the parser merges multiple instances of the same field,
75 -- IMPORTANT For embedded message fields, the parser merges multiple instances of the same field,
@@ -86,44 +92,56 @@ parseUnknownField wireType = case wireType of
87-- https://pursuit.purescript.org/packages/purescript-record
93-- https://pursuit.purescript.org/packages/purescript-record
95+-- IMPORTANT We need to wrap our structural record types in a nominal
96+-- data type so that we can nest records.
97+-- https://github.com/purescript/documentation/blob/master/errors/CycleInTypeSynonym.md
98+-- And so that we can assign instances?
99+newtype CodeGeneratorRequest = CodeGeneratorRequest CodeGeneratorRequestR
100+derive instance genericCodeGeneratorRequest :: Generic CodeGeneratorRequest _
101+instance showCodeGeneratorRequest :: Show CodeGeneratorRequest where show = genericShow
89-- | Data type for a CodeGenerationRequest message.
102-- | Data type for a CodeGenerationRequest message.
90-- | https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.compiler.plugin.pb
103-- | https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.compiler.plugin.pb
91−-- data CodeGeneratorRequest = CodeGeneratorRequest CodeGeneratorRequestRow
104+type CodeGeneratorRequestR =
92−-- derive instance showCodeGeneratorRequest :: Show CodeGeneratorRequest
93−type CodeGeneratorRequestRow =
94 { file_to_generate :: Array String -- 1
105 { file_to_generate :: Array String -- 1
95 , parameter :: Maybe String -- 2
106 , parameter :: Maybe String -- 2
96 , proto_file :: Array FileDescriptorProto -- 15
107 , proto_file :: Array FileDescriptorProto -- 15
97 , compiler_version :: Maybe Version -- 3
108 , compiler_version :: Maybe Version -- 3
99−defaultCodeGeneratorRequest :: CodeGeneratorRequestRow
111+defaultCodeGeneratorRequest :: CodeGeneratorRequestR
100defaultCodeGeneratorRequest =
112defaultCodeGeneratorRequest =
101 { file_to_generate: []
113 { file_to_generate: []
102 , parameter: Nothing
114 , parameter: Nothing
103 , proto_file: []
115 , proto_file: []
104 , compiler_version: Nothing
116 , compiler_version: Nothing
106−fs_CodeGeneratorRequestRow_file_to_generate = SProxy :: SProxy "file_to_generate"
118+fs_CodeGeneratorRequest_file_to_generate = SProxy :: SProxy "file_to_generate"
107−fs_CodeGeneratorRequestRow_parameter = SProxy :: SProxy "parameter"
119+fs_CodeGeneratorRequest_parameter = SProxy :: SProxy "parameter"
108−fs_CodeGeneratorRequestRow_proto_file = SProxy :: SProxy "proto_file"
120+fs_CodeGeneratorRequest_proto_file = SProxy :: SProxy "proto_file"
109−fs_CodeGeneratorRequestRow_compiler_version = SProxy :: SProxy "compiler_version"
121+fs_CodeGeneratorRequest_compiler_version = SProxy :: SProxy "compiler_version"
110−fn_CodeGeneratorRequestRow_file_to_generate = UInt.fromInt 1 :: UInt
122+fn_CodeGeneratorRequest_file_to_generate = UInt.fromInt 1 :: UInt
111−fn_CodeGeneratorRequestRow_parameter = UInt.fromInt 2 :: UInt
123+fn_CodeGeneratorRequest_parameter = UInt.fromInt 2 :: UInt
112−fn_CodeGeneratorRequestRow_proto_file = UInt.fromInt 15 :: UInt
124+fn_CodeGeneratorRequest_proto_file = UInt.fromInt 15 :: UInt
113−fn_CodeGeneratorRequestRow_compiler_version = UInt.fromInt 3 :: UInt
125+fn_CodeGeneratorRequest_compiler_version = UInt.fromInt 3 :: UInt
115-- | The version number of protocol compiler.
127-- | The version number of protocol compiler.
116−data Version = Version
128+newtype Version = Version VersionR
129+derive instance genericVersion :: Generic Version _
130+instance showVersion :: Show Version where show = genericShow
117 { major :: Maybe Int --1
132 { major :: Maybe Int --1
118 , minor :: Maybe Int --2
133 , minor :: Maybe Int --2
119 , patch :: Maybe Int --3
134 , patch :: Maybe Int --3
120 , suffix :: Maybe String -- 4
135 , suffix :: Maybe String -- 4
138+newtype FileDescriptorProto = FileDescriptorProto FileDescriptorProtoR
139+derive instance genericFileDescriptorProto :: Generic FileDescriptorProto _
140+instance showFileDescriptorProto :: Show FileDescriptorProto where show = const "" -- TODO genericShow
123-- | Describes a complete .proto file.
141-- | Describes a complete .proto file.
124-- | https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor.pb
142-- | https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor.pb
125-- | The syntax for decoding this is "proto2"?
143-- | The syntax for decoding this is "proto2"?
126−data FileDescriptorProto = FileDescriptorProto
144+type FileDescriptorProtoR =
127 { name :: Maybe String -- 1
145 { name :: Maybe String -- 1
128 , package :: Maybe String -- 2
146 , package :: Maybe String -- 2
129 , dependency :: Array String -- 3
147 , dependency :: Array String -- 3
@@ -137,8 +155,11 @@ data FileDescriptorProto = FileDescriptorProto
137 , syntax :: Maybe String -- 12
155 , syntax :: Maybe String -- 12
158+newtype DescriptorProto = DescriptorProto DescriptorProtoR
159+derive instance genericDescriptorProto :: Generic DescriptorProto _
160+instance showDescriptorProto :: Show DescriptorProto where show = const "" -- TODO genericShow
140-- | Describes a message type.
161-- | Describes a message type.
141−data DescriptorProto = DescriptorProto
162+type DescriptorProtoR =
142 { name :: Maybe String -- 1
163 { name :: Maybe String -- 1
143 , field :: Array FieldDescriptorProto -- 2
164 , field :: Array FieldDescriptorProto -- 2
144 , extension :: Array FieldDescriptorProto -- 6
165 , extension :: Array FieldDescriptorProto -- 6
@@ -150,7 +171,10 @@ data DescriptorProto = DescriptorProto
150 -- TODO eh who cares about reserved ranges
171 -- TODO eh who cares about reserved ranges
153−data DescriptorProto_ExtensionRange = DescriptorProto_ExtensionRange
174+newtype DescriptorProto_ExtensionRange = DescriptorProto_ExtensionRange DescriptorProto_ExtensionRangeR
175+derive instance genericDescriptorProto_ExtensionRange :: Generic DescriptorProto_ExtensionRange _
176+instance showDescriptorProto_ExtensionRange :: Show DescriptorProto_ExtensionRange where show = genericShow
177+type DescriptorProto_ExtensionRangeR =
154 { start :: Maybe Int -- 1
178 { start :: Maybe Int -- 1
155 , end :: Maybe Int -- 2
179 , end :: Maybe Int -- 2
156 -- TODO , options :: Maybe ExtensionRangeOptions
180 -- TODO , options :: Maybe ExtensionRangeOptions
@@ -163,9 +187,14 @@ data DescriptorProto_ExtensionRange = DescriptorProto_ExtensionRange
165data FieldDescriptorProto_Label = OPTIONAL | REQUIRED | REPEATED
189data FieldDescriptorProto_Label = OPTIONAL | REQUIRED | REPEATED
190+derive instance genericFieldDescriptorProto_Label :: Generic FieldDescriptorProto_Label _
191+instance showFieldDescriptorProto_Label :: Show FieldDescriptorProto_Label where show = genericShow
167-- | Describes a field within a message.
193-- | Describes a field within a message.
168−data FieldDescriptorProto = FieldDescriptorProto
194+newtype FieldDescriptorProto = FieldDescriptorProto FieldDescriptorProtoR
195+derive instance genericFieldDescriptorProto :: Generic FieldDescriptorProto _
196+instance showFieldDescriptorProto :: Show FieldDescriptorProto where show = genericShow
197+type FieldDescriptorProtoR =
169 { name :: Maybe String -- 1
198 { name :: Maybe String -- 1
170 , number :: Maybe Int -- 3
199 , number :: Maybe Int -- 3
171 , label :: Maybe FieldDescriptorProto_Label -- 4
200 , label :: Maybe FieldDescriptorProto_Label -- 4
@@ -179,13 +208,19 @@ data FieldDescriptorProto = FieldDescriptorProto
181-- | Describes a oneof.
210-- | Describes a oneof.
182−data OneofDescriptorProto = OneofDescriptorProto
211+newtype OneofDescriptorProto = OneofDescriptorProto OneofDescriptorProtoR
212+derive instance genericOneofDescriptorProto :: Generic OneofDescriptorProto _
213+instance showOneofDescriptorProto :: Show OneofDescriptorProto where show = genericShow
214+type OneofDescriptorProtoR =
183 { name :: Maybe String -- 1
215 { name :: Maybe String -- 1
184 -- TODO , options :: Maybe OneofOptions -- 2
216 -- TODO , options :: Maybe OneofOptions -- 2
187-- | Describes an enum type.
219-- | Describes an enum type.
188−data EnumDescriptorProto = EnumDescriptorProto
220+newtype EnumDescriptorProto = EnumDescriptorProto EnumDescriptorProtoR
221+derive instance genericEnumDescriptorProto :: Generic EnumDescriptorProto _
222+instance showEnumDescriptorProto :: Show EnumDescriptorProto where show = genericShow
223+type EnumDescriptorProtoR =
189 { name :: Maybe String -- 1
224 { name :: Maybe String -- 1
190 , value :: Array EnumValueDescriptorProto -- 2
225 , value :: Array EnumValueDescriptorProto -- 2
191 -- TODO , options :: Maybe EnumOptions -- 3
226 -- TODO , options :: Maybe EnumOptions -- 3
@@ -194,7 +229,10 @@ data EnumDescriptorProto = EnumDescriptorProto
196-- | Describes a value within an enum.
231-- | Describes a value within an enum.
197−data EnumValueDescriptorProto = EnumValueDescriptorProto
232+newtype EnumValueDescriptorProto = EnumValueDescriptorProto EnumValueDescriptorProtoR
233+derive instance genericEnumValueDescriptorProto :: Generic EnumValueDescriptorProto _
234+instance showEnumValueDescriptorProto :: Show EnumValueDescriptorProto where show = genericShow
235+type EnumValueDescriptorProtoR =
198 { name :: Maybe String -- 1
236 { name :: Maybe String -- 1
199 , number :: Maybe Int -- 2
237 , number :: Maybe Int -- 2
200 -- TODO , options :: Maybe EnumValueOptions -- 3
238 -- TODO , options :: Maybe EnumValueOptions -- 3