@@ -105,26 +105,39 @@ defmodule Protobuf.Protoc.CLI do
105105 new_ctx = append_ns ( ctx , name )
106106
107107 types
108- |> update_types ( ctx , name )
108+ |> update_types ( ctx , desc )
109109 |> find_types_in_proto ( new_ctx , desc . enum_type )
110110 |> find_types_in_proto ( new_ctx , desc . nested_type )
111111 end
112112
113- defp find_types_in_proto ( types , ctx , % Google.Protobuf.EnumDescriptorProto { name: name } ) do
114- update_types ( types , ctx , name )
113+ defp find_types_in_proto ( types , ctx , desc ) do
114+ update_types ( types , ctx , desc )
115115 end
116116
117117 defp append_ns ( % { namespace: ns } = ctx , name ) do
118118 new_ns = ns ++ [ name ]
119119 Map . put ( ctx , :namespace , new_ns )
120120 end
121121
122- defp update_types ( types , % { namespace: ns , package: pkg , module_prefix: prefix } , name ) do
123- type_name =
124- join_names ( prefix || pkg , ns , name )
125- |> Protobuf.Protoc.Generator.Util . normalize_type_name ( )
122+ defp update_types ( types , % { namespace: ns , package: pkg , module_prefix: prefix } , desc ) do
123+ name = desc . name
124+ module_name = gen_module_name ( prefix , pkg , ns , name )
126125
127- Map . put ( types , "." <> join_names ( pkg , ns , name ) , % { type_name: type_name } )
126+ typespec =
127+ desc . options
128+ |> get_msg_options ( )
129+ |> Map . get ( :typespec )
130+
131+ Map . put ( types , "." <> join_names ( pkg , ns , name ) , % {
132+ type_name: module_name ,
133+ typespec: typespec
134+ } )
135+ end
136+
137+ defp gen_module_name ( prefix , pkg , ns , name ) do
138+ ( prefix || pkg )
139+ |> join_names ( ns , name )
140+ |> Protobuf.Protoc.Generator.Util . normalize_type_name ( )
128141 end
129142
130143 defp join_names ( pkg , ns , name ) do
@@ -134,4 +147,16 @@ defmodule Protobuf.Protoc.CLI do
134147 |> Enum . filter ( & ( & 1 && & 1 != "" ) )
135148 |> Enum . join ( "." )
136149 end
150+
151+ defp get_msg_options ( nil ) , do: % { }
152+
153+ defp get_msg_options ( options ) do
154+ case Google.Protobuf.MessageOptions . get_extension ( options , Elixirpb.PbExtension , :message ) do
155+ nil ->
156+ % { }
157+
158+ opts ->
159+ opts
160+ end
161+ end
137162end
0 commit comments