( cmd *cobra.Command, input taskBlockInput, now time.Time, )
| 1350 | } |
| 1351 | |
| 1352 | func buildTaskBlockRequest( |
| 1353 | cmd *cobra.Command, |
| 1354 | input taskBlockInput, |
| 1355 | now time.Time, |
| 1356 | ) (CreateTaskBlockRequest, error) { |
| 1357 | kind := taskpkg.BlockKind(strings.TrimSpace(input.KindRaw)).Normalize() |
| 1358 | if err := kind.Validate("task_block.kind"); err != nil { |
| 1359 | return CreateTaskBlockRequest{}, fmt.Errorf("cli: %w", err) |
| 1360 | } |
| 1361 | reason := strings.TrimSpace(input.Reason) |
| 1362 | if reason == "" { |
| 1363 | return CreateTaskBlockRequest{}, errors.New("cli: --reason is required") |
| 1364 | } |
| 1365 | request := CreateTaskBlockRequest{ |
| 1366 | Kind: kind, |
| 1367 | Reason: reason, |
| 1368 | RunID: strings.TrimSpace(input.RunID), |
| 1369 | } |
| 1370 | if cmd.Flags().Changed("details") { |
| 1371 | details, err := parseAgentTaskJSONFlag("details", input.DetailsRaw) |
| 1372 | if err != nil { |
| 1373 | return CreateTaskBlockRequest{}, err |
| 1374 | } |
| 1375 | request.Details = details |
| 1376 | } |
| 1377 | if strings.TrimSpace(input.ExpiresIn) != "" { |
| 1378 | duration, err := time.ParseDuration(strings.TrimSpace(input.ExpiresIn)) |
| 1379 | if err != nil { |
| 1380 | return CreateTaskBlockRequest{}, fmt.Errorf("cli: invalid --expires-in duration: %w", err) |
| 1381 | } |
| 1382 | if duration <= 0 { |
| 1383 | return CreateTaskBlockRequest{}, errors.New("cli: --expires-in must be positive") |
| 1384 | } |
| 1385 | expiresAt := now.Add(duration).UTC() |
| 1386 | request.ExpiresAt = &expiresAt |
| 1387 | } |
| 1388 | return request, nil |
| 1389 | } |
| 1390 | |
| 1391 | func newTaskCancelCommand(deps commandDeps) *cobra.Command { |
| 1392 | var ( |
no test coverage detected