@@ -58,32 +58,56 @@ func newDriverManifest(manifest *manifest.Manifest) protocol1.DriverManifest {
5858 }
5959}
6060
61+ func containsLang (lang string , list []manifest.Manifest ) bool {
62+ for _ , m := range list {
63+ if m .Language == lang {
64+ return true
65+ }
66+ for _ , l := range m .Aliases {
67+ if l == lang {
68+ return true
69+ }
70+ }
71+ }
72+ return false
73+ }
74+
75+ // SupportedLanguages implements protocol1.Service.
6176func (s service ) SupportedLanguages (_ * protocol1.SupportedLanguagesRequest ) * protocol1.SupportedLanguagesResponse {
62- m , _ := s .d .Manifest ()
63- return & protocol1.SupportedLanguagesResponse {Languages : []protocol1.DriverManifest {
64- newDriverManifest (& m ),
65- }}
77+ ctx , cancel := context .WithTimeout (context .Background (), time .Minute )
78+ defer cancel ()
79+ list , err := s .d .Languages (ctx )
80+ if err != nil {
81+ return & protocol1.SupportedLanguagesResponse {Response : errResp (err )}
82+ }
83+ resp := & protocol1.SupportedLanguagesResponse {
84+ Response : protocol1.Response {Status : protocol1 .Ok },
85+ }
86+ for _ , m := range list {
87+ resp .Languages = append (resp .Languages , newDriverManifest (& m ))
88+ }
89+ return resp
6690}
6791
6892func (s service ) parse (mode driver.Mode , req * protocol1.ParseRequest ) (nodes.Node , protocol1.Response ) {
6993 start := time .Now ()
70- m , err := s .d .Manifest ()
94+ ctx := context .Background ()
95+ if req .Timeout > 0 {
96+ var cancel func ()
97+ ctx , cancel = context .WithTimeout (ctx , req .Timeout )
98+ defer cancel ()
99+ }
100+ list , err := s .d .Languages (ctx )
71101 if err != nil {
72102 r := errResp (err )
73103 r .Elapsed = time .Since (start )
74104 return nil , r
75105 }
76- if req .Language != m . Language {
106+ if ! containsLang ( req .Language , list ) {
77107 r := errResp (ErrUnsupportedLanguage .New (req .Language ))
78108 r .Elapsed = time .Since (start )
79109 return nil , r
80110 }
81- ctx := context .Background ()
82- if req .Timeout > 0 {
83- var cancel func ()
84- ctx , cancel = context .WithTimeout (ctx , req .Timeout )
85- defer cancel ()
86- }
87111 ast , err := s .d .Parse (ctx , req .Content , & driver.ParseOptions {
88112 Mode : mode ,
89113 Language : req .Language ,
@@ -100,6 +124,7 @@ func (s service) parse(mode driver.Mode, req *protocol1.ParseRequest) (nodes.Nod
100124 return ast , r
101125}
102126
127+ // Parse implements protocol1.Service.
103128func (s service ) Parse (req * protocol1.ParseRequest ) * protocol1.ParseResponse {
104129 ast , resp := s .parse (driver .ModeAnnotated , req )
105130 if resp .Status != protocol1 .Ok {
@@ -119,6 +144,7 @@ func (s service) Parse(req *protocol1.ParseRequest) *protocol1.ParseResponse {
119144 }
120145}
121146
147+ // NativeParse implements protocol1.Service.
122148func (s service ) NativeParse (req * protocol1.NativeParseRequest ) * protocol1.NativeParseResponse {
123149 ast , resp := s .parse (driver .ModeNative , (* protocol1 .ParseRequest )(req ))
124150 if resp .Status != protocol1 .Ok {
@@ -137,14 +163,17 @@ func (s service) NativeParse(req *protocol1.NativeParseRequest) *protocol1.Nativ
137163 }
138164}
139165
166+ // Version implements protocol1.Service.
140167func (s service ) Version (req * protocol1.VersionRequest ) * protocol1.VersionResponse {
141- m , _ := s .d .Manifest ()
168+ ctx , cancel := context .WithTimeout (context .Background (), time .Minute )
169+ defer cancel ()
142170
143- r := & protocol1.VersionResponse {
144- Version : m .Version ,
171+ m , err := s .d .Version (ctx )
172+ if err != nil {
173+ return & protocol1.VersionResponse {Response : errResp (err )}
145174 }
146- if m .Build != nil {
147- r .Build = * m .Build
175+ return & protocol1.VersionResponse {
176+ Version : m .Version ,
177+ Build : m .Build ,
148178 }
149- return r
150179}
0 commit comments