1import * as Schema from "effect/Schema";
2import { TrimmedNonEmptyString } from "./baseSchemas.ts";
3import { GitCommandError } from "./git.ts";
4import { VcsError } from "./vcs.ts";
5
6export const ReviewDiffPreviewInput = Schema.Struct({
7 cwd: TrimmedNonEmptyString,
8 baseRef: Schema.optional(TrimmedNonEmptyString),
9 commitSha: Schema.optional(TrimmedNonEmptyString),
10 ignoreWhitespace: Schema.optionalKey(Schema.Boolean),
11 sourceKind: Schema.optionalKey(Schema.Literals(["working-tree", "branch-range"])),
12 trackedOnly: Schema.optionalKey(Schema.Boolean),
13 metadataOnly: Schema.optionalKey(Schema.Boolean),
14 file: Schema.optionalKey(
15 Schema.Struct({
16 path: Schema.NonEmptyString,
17 previousPath: Schema.NullOr(Schema.NonEmptyString),
18 sourceKind: Schema.Literals(["working-tree", "branch-range", "commit"]),
19 }),
20 ),
21});
22export type ReviewDiffPreviewInput = typeof ReviewDiffPreviewInput.Type;
23
24export const ReviewBranchCommitsInput = Schema.Struct({
25 cwd: TrimmedNonEmptyString,
26 baseRef: Schema.optional(TrimmedNonEmptyString),
27});
28export type ReviewBranchCommitsInput = typeof ReviewBranchCommitsInput.Type;
29
30export const ReviewBranchCommitsResult = Schema.Struct({
31 commits: Schema.Array(
32 Schema.Struct({
33 sha: Schema.String,
34 subject: Schema.String,
35 committedAt: Schema.String,
36 }),
37 ),
38 truncated: Schema.Boolean,
39});
40export type ReviewBranchCommitsResult = typeof ReviewBranchCommitsResult.Type;
41
42export const ReviewDiffPreviewSourceKind = Schema.Literals([
43 "working-tree",
44 "branch-range",
45 "commit",
46]);
47export type ReviewDiffPreviewSourceKind = typeof ReviewDiffPreviewSourceKind.Type;
48
49export const ReviewDiffFileStat = Schema.Struct({
50 path: Schema.String,
51 previousPath: Schema.NullOr(Schema.String),
52 additions: Schema.Number,
53 deletions: Schema.Number,
54});
55export type ReviewDiffFileStat = typeof ReviewDiffFileStat.Type;
56
57export const ReviewDiffPreviewSource = Schema.Struct({
58 id: TrimmedNonEmptyString,
59 kind: ReviewDiffPreviewSourceKind,
60 title: TrimmedNonEmptyString,
61 commitSubject: Schema.optionalKey(TrimmedNonEmptyString),
62 baseRef: Schema.NullOr(TrimmedNonEmptyString),
63 headRef: Schema.NullOr(TrimmedNonEmptyString),
64 diff: Schema.String,
65 diffHash: TrimmedNonEmptyString,
66 truncated: Schema.Boolean,
67 patchesDeferred: Schema.optionalKey(Schema.Boolean),
68 files: Schema.optionalKey(Schema.Array(ReviewDiffFileStat)),
69});
70export type ReviewDiffPreviewSource = typeof ReviewDiffPreviewSource.Type;
71
72export const ReviewDiffFileContentsInput = Schema.Struct({
73 cwd: TrimmedNonEmptyString,
74 sourceKind: ReviewDiffPreviewSourceKind,
75 changeType: Schema.Literals(["change", "rename-pure", "rename-changed", "new", "deleted"]),
76 baseRef: Schema.NullOr(TrimmedNonEmptyString),
77 headRef: Schema.NullOr(TrimmedNonEmptyString),
78 oldPath: TrimmedNonEmptyString,
79 newPath: TrimmedNonEmptyString,
80});
81export type ReviewDiffFileContentsInput = typeof ReviewDiffFileContentsInput.Type;
82
83export const ReviewDiffFileContentsResult = Schema.Struct({
84 oldContents: Schema.String,
85 newContents: Schema.String,
86});
87export type ReviewDiffFileContentsResult = typeof ReviewDiffFileContentsResult.Type;
88
89export const ReviewDiffPreviewResult = Schema.Struct({
90 cwd: TrimmedNonEmptyString,
91 generatedAt: Schema.DateTimeUtc,
92 sources: Schema.Array(ReviewDiffPreviewSource),
93 incomplete: Schema.optionalKey(Schema.Boolean),
94});
95export type ReviewDiffPreviewResult = typeof ReviewDiffPreviewResult.Type;
96
97export const ReviewDiffPreviewError = Schema.Union([VcsError, GitCommandError]);
98export type ReviewDiffPreviewError = typeof ReviewDiffPreviewError.Type;