@@ -27,6 +27,8 @@ func (s *Service) Mount(r *mux.Router) {
2727 r .Path ("/suggest" ).HandlerFunc (s .GetSuggestion )
2828 r .Path ("/compile" ).Methods (http .MethodPost ).HandlerFunc (s .Compile )
2929 r .Path ("/format" ).Methods (http .MethodPost ).HandlerFunc (s .FormatCode )
30+ r .Path ("/share" ).Methods (http .MethodPost ).HandlerFunc (s .Share )
31+ r .Path ("/snippet/{id}" ).Methods (http .MethodGet ).HandlerFunc (s .GetSnippet )
3032}
3133
3234func (s * Service ) lookupBuiltin (val string ) (* SuggestionsResponse , error ) {
@@ -107,7 +109,7 @@ func (s *Service) goImportsCode(w http.ResponseWriter, r *http.Request) ([]byte,
107109 }
108110
109111 if err = resp .HasError (); err != nil {
110- Errorf (http .StatusBadRequest , err .Error ())
112+ Errorf (http .StatusBadRequest , err .Error ()). Write ( w )
111113 return nil , err , false
112114 }
113115
@@ -118,16 +120,64 @@ func (s *Service) goImportsCode(w http.ResponseWriter, r *http.Request) ([]byte,
118120func (s * Service ) FormatCode (w http.ResponseWriter , r * http.Request ) {
119121 code , err , _ := s .goImportsCode (w , r )
120122 if err != nil {
123+ if goplay .IsCompileError (err ) {
124+ return
125+ }
126+
121127 s .log .Error (err )
122128 return
123129 }
124130
125131 WriteJSON (w , CompilerResponse {Formatted : string (code )})
126132}
127133
134+ func (s * Service ) Share (w http.ResponseWriter , r * http.Request ) {
135+ shareID , err := goplay .Share (r .Context (), r .Body )
136+ defer r .Body .Close ()
137+ if err != nil {
138+ if err == goplay .ErrSnippetTooLarge {
139+ Errorf (http .StatusRequestEntityTooLarge , err .Error ()).Write (w )
140+ return
141+ }
142+
143+ s .log .Error ("failed to share code: " , err )
144+ NewErrorResponse (err ).Write (w )
145+ }
146+
147+ WriteJSON (w , ShareResponse {SnippetID : shareID })
148+ }
149+
150+ func (s * Service ) GetSnippet (w http.ResponseWriter , r * http.Request ) {
151+ vars := mux .Vars (r )
152+ snippetID := vars ["id" ]
153+ snippet , err := goplay .GetSnippet (r .Context (), snippetID )
154+ if err != nil {
155+ if err == goplay .ErrSnippetNotFound {
156+ Errorf (http .StatusNotFound , "snippet %q not found" , snippetID ).Write (w )
157+ return
158+ }
159+
160+ s .log .Errorw ("failed to get snippet" ,
161+ "snippetID" , snippetID ,
162+ "err" , err ,
163+ )
164+ NewErrorResponse (err ).Write (w )
165+ return
166+ }
167+
168+ WriteJSON (w , SnippetResponse {
169+ FileName : snippet .FileName ,
170+ Code : snippet .Contents ,
171+ })
172+ }
173+
128174func (s * Service ) Compile (w http.ResponseWriter , r * http.Request ) {
129175 src , err , changed := s .goImportsCode (w , r )
130176 if err != nil {
177+ if goplay .IsCompileError (err ) {
178+ return
179+ }
180+
131181 s .log .Error (err )
132182 return
133183 }
@@ -149,6 +199,6 @@ func (s *Service) Compile(w http.ResponseWriter, r *http.Request) {
149199 result .Formatted = string (src )
150200 }
151201
152- s .log .Debugw ("resp from compiler" , "res" , res )
202+ s .log .Debugw ("response from compiler" , "res" , res )
153203 WriteJSON (w , result )
154204}
0 commit comments