submit submits the documents to the Exercism API.
(metadata *workspace.ExerciseMetadata, docs []workspace.Document)
| 253 | |
| 254 | // submit submits the documents to the Exercism API. |
| 255 | func (s *submitCmdContext) submit(metadata *workspace.ExerciseMetadata, docs []workspace.Document) error { |
| 256 | body := &bytes.Buffer{} |
| 257 | writer := multipart.NewWriter(body) |
| 258 | |
| 259 | for _, doc := range docs { |
| 260 | file, err := os.Open(doc.Filepath()) |
| 261 | if err != nil { |
| 262 | return err |
| 263 | } |
| 264 | defer file.Close() |
| 265 | |
| 266 | part, err := writer.CreateFormFile("files[]", doc.Path()) |
| 267 | if err != nil { |
| 268 | return err |
| 269 | } |
| 270 | _, err = io.Copy(part, file) |
| 271 | if err != nil { |
| 272 | return err |
| 273 | } |
| 274 | } |
| 275 | if err := writer.Close(); err != nil { |
| 276 | return err |
| 277 | } |
| 278 | |
| 279 | client, err := api.NewClient(s.usrCfg.GetString("token"), s.usrCfg.GetString("apibaseurl")) |
| 280 | if err != nil { |
| 281 | return err |
| 282 | } |
| 283 | url := fmt.Sprintf("%s/solutions/%s", s.usrCfg.GetString("apibaseurl"), metadata.ID) |
| 284 | req, err := client.NewRequest("PATCH", url, body) |
| 285 | if err != nil { |
| 286 | return err |
| 287 | } |
| 288 | req.Header.Set("Content-Type", writer.FormDataContentType()) |
| 289 | |
| 290 | resp, err := client.Do(req) |
| 291 | if err != nil { |
| 292 | return err |
| 293 | } |
| 294 | defer resp.Body.Close() |
| 295 | |
| 296 | if resp.StatusCode < 200 || resp.StatusCode > 299 { |
| 297 | return decodedAPIError(resp) |
| 298 | } |
| 299 | |
| 300 | bb := &bytes.Buffer{} |
| 301 | _, err = bb.ReadFrom(resp.Body) |
| 302 | if err != nil { |
| 303 | return err |
| 304 | } |
| 305 | return nil |
| 306 | } |
| 307 | |
| 308 | func (s *submitCmdContext) printResult(metadata *workspace.ExerciseMetadata) { |
| 309 | msg := ` |
no test coverage detected