diff --git a/agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md b/agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md index 06f89f3..6f2b95e 100644 --- a/agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md +++ b/agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md @@ -26,31 +26,24 @@ proto-socket을 transport로 유지하면서 ALT application protobuf 계약을 - contract compatibility note - generated output 검증 명령 -## 필수 기능 +## 기능 ### Epic: [contracts] Contract schema and codegen ALT application protobuf 계약과 generated output 검증 흐름을 묶는다. - [ ] [schema-baseline] `common.proto`, `market.proto`, `backtest.proto`가 MVP payload 기준을 담는다. -- [ ] [go-codegen] Go generated contract를 반복 생성할 수 있는 명령이 있다. -- [ ] [dart-codegen] Flutter client가 사용할 Dart generated contract를 반복 생성할 수 있는 명령이 있다. +- [ ] [go-codegen] Go generated contract를 반복 생성할 수 있는 명령이 있다. 검증: 문서화된 Go contract generation 명령이 로컬에서 실행된다. +- [ ] [dart-codegen] Flutter client가 사용할 Dart generated contract를 반복 생성할 수 있는 명령이 있다. 검증: 문서화된 Dart contract generation 명령이 로컬에서 실행된다. - [ ] [parser-map] API/client에서 contract message parser map을 구성할 표준 위치와 패턴이 정해져 있다. -- [ ] [compat-note] additive change, field number, versioning 기준이 contracts 문서에 정리되어 있다. -- [ ] [contract-check] root 검증 또는 contracts 검증 명령이 schema/codegen drift를 감지한다. - -## 완료 기준 - -- [ ] Go와 Dart contract generation 명령이 문서화되어 있고 로컬에서 실행된다. -- [ ] generated output은 source schema와 함께 검증할 수 있다. -- [ ] proto-socket transport proto와 ALT application proto의 책임이 문서에서 분리되어 있다. -- [ ] `bin/test`와 `bin/lint`가 contract 변경 후 통과한다. +- [ ] [compat-note] additive change, field number, versioning 기준과 proto-socket transport proto / ALT application proto 책임 분리가 contracts 문서에 정리되어 있다. +- [ ] [contract-check] root 검증 또는 contracts 검증 명령이 schema/codegen drift를 감지한다. 검증: generated output을 source schema와 대조할 수 있고 `bin/test`, `bin/lint`가 contract 변경 후 통과한다. ## 완료 리뷰 - 상태: 없음 - 요청일: 없음 -- 완료 근거: 아직 필수 기능과 완료 기준이 충족되지 않았다. +- 완료 근거: 아직 기능 Task와 Task별 검증이 충족되지 않았다. - 리뷰 필요: - [ ] 사용자가 완료 결과를 확인했다 - [ ] archive 이동을 승인했다 diff --git a/agent-task/m-contract-codegen-baseline/03+02_api_parser_map/CODE_REVIEW-cloud-G06.md b/agent-task/m-contract-codegen-baseline/03+02_api_parser_map/CODE_REVIEW-cloud-G06.md new file mode 100644 index 0000000..c290557 --- /dev/null +++ b/agent-task/m-contract-codegen-baseline/03+02_api_parser_map/CODE_REVIEW-cloud-G06.md @@ -0,0 +1,111 @@ + + +# Code Review Reference - API + +> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.** +> The task is NOT complete until every implementation-owned section below is filled in. +> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving. +> Fill implementation-owned sections, then stop with active files in place and report ready for review. +> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume. +> Follow the ownership table at the bottom of this file for which sections you own. + +## 개요 + +date=2026-05-28 +task=m-contract-codegen-baseline/03+02_api_parser_map, plan=0, tag=API + +## 이 파일을 읽는 리뷰 에이전트에게 + +> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다. + +각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. +리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다. + +1. 판정을 append한다. +2. `CODE_REVIEW-cloud-G06.md` → `code_review_cloud_G06_N.log`, `PLAN-cloud-G06.md` → `plan_cloud_G06_M.log`로 아카이브한다. +3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-contract-codegen-baseline/03+02_api_parser_map/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 사용자 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다. +4. PASS이고 task group이 `m-`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다. +5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다. + +--- + +## 구현 항목별 완료 여부 + +| 항목 | 완료 여부 | +|------|---------| +| [API-1] API contract parser map helper | [ ] | +| [API-2] Wire parser map into socket server | [ ] | + +## 구현 체크리스트 + +- [ ] [API-1] API 내부 contract parser map helper와 unit test를 추가한다. +- [ ] [API-2] socket server construction이 API parser map을 사용하도록 연결하고 module dependency를 정리한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 코드리뷰 전용 체크리스트 + +> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. +> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다. + +- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. +- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다. +- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G06_N.log`로 아카이브한다. +- [ ] active `PLAN-*-G??.md`를 `plan_cloud_G06_M.log`로 아카이브한다. +- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다. +- [ ] PASS이면 active task 디렉터리 `agent-task/m-contract-codegen-baseline/03+02_api_parser_map/`를 `agent-task/archive/YYYY/MM/m-contract-codegen-baseline/03+02_api_parser_map/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다. +- [ ] PASS이고 task group이 `m-`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다. +- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-contract-codegen-baseline/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다. +- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G06.md`와 `CODE_REVIEW-cloud-G06.md`를 작성하고 `complete.log`를 작성하지 않는다. +- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다. +- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다. + +## 계획 대비 변경 사항 + +_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ + +## 주요 설계 결정 + +_구현 에이전트가 주요 설계 결정 사항을 기록한다._ + +## 리뷰어를 위한 체크포인트 + +- API parser map이 모든 generated request/response payload를 등록하는지 확인한다. +- parser helper가 package-level mutable map을 공유하지 않는지 확인한다. +- `server.go`가 empty parser map 대신 API parser map을 쓰는지 확인한다. + +## 검증 결과 + +_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._ + +필수 규칙: +- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다. +- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다. +- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다. + +### API-1 중간 검증 +```bash +$ cd services/api && go test ./internal/contracts +(output) +``` + +### API-2 중간 검증 +```bash +$ cd services/api && go test ./... +(output) +``` + +### 최종 검증 +```bash +$ cd services/api && go test ./... +(output) +$ bin/test +(output) +$ bin/lint +(output) +``` + +--- + +> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?** +> If anything is blank, go back and fill it in before saving this file. +> Leave review-agent-only sections unchanged. diff --git a/agent-task/m-contract-codegen-baseline/03+02_api_parser_map/PLAN-cloud-G06.md b/agent-task/m-contract-codegen-baseline/03+02_api_parser_map/PLAN-cloud-G06.md new file mode 100644 index 0000000..32268c6 --- /dev/null +++ b/agent-task/m-contract-codegen-baseline/03+02_api_parser_map/PLAN-cloud-G06.md @@ -0,0 +1,188 @@ + + +# Plan - API Parser Map + +## 이 파일을 읽는 구현 에이전트에게 + +`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 반드시 채운다. 검증 명령을 실행하고 실제 stdout/stderr를 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 최종화는 code-review 스킬 전용이다. + +## 배경 + +Go API는 proto-socket session boundary를 맡지만 현재 ALT application payload parser map을 등록하지 않는다. `02+01_codegen_check`가 generated Go contracts를 만든 뒤, API 내부에 표준 parser map 위치를 두면 다음 `Socket Session Loop` Milestone에서 handshake/request-response를 바로 얹을 수 있다. + +## 분석 결과 + +### 읽은 파일 + +- `agent-roadmap/current.md` +- `agent-roadmap/phase/foundation-alignment/PHASE.md` +- `agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md` +- `agent-ops/rules/project/domain/api/rules.md` +- `agent-ops/rules/project/domain/contracts/rules.md` +- `services/api/go.mod` +- `services/api/internal/socket/server.go` +- `services/api/internal/config/config.go` +- `services/api/cmd/alt-api/main.go` +- `packages/contracts/proto/alt/v1/common.proto` +- `packages/contracts/proto/alt/v1/market.proto` +- `packages/contracts/proto/alt/v1/backtest.proto` +- `../proto-socket/go/communicator.go` +- `bin/test` +- `bin/lint` + +### 테스트 커버리지 공백 + +- API parser map helper: 기존 테스트 없음. 새 unit test가 모든 ALT request/response/result message key와 parse success를 검증해야 한다. +- `socket.NewServer` parser map 주입: 기존 테스트 없음. 최소한 helper가 non-empty이고 server construction이 컴파일되는 것을 `go test ./...`로 검증한다. + +### 심볼 참조 + +- renamed/removed symbols: none. + +### 분할 판단 + +분할 정책을 먼저 평가했다. 이 plan은 `03+02_api_parser_map`이며 `02+01_codegen_check`가 `complete.log`를 만든 뒤 시작한다. Client Dart parser map은 별도 `04+02_client_parser_map`에서 병렬 처리한다. + +### 범위 결정 근거 + +이 subtask는 `services/api/**`와 API module dependency만 다룬다. Flutter client parser map, UI, actual request handlers, worker execution은 범위 밖이다. + +### 빌드 등급 + +build=`cloud-G06`, review=`cloud-G06`. Protocol parser registration이 API runtime boundary에 들어가고 generated module dependency를 추가하므로 cloud review가 필요하다. + +## 의존 관계 및 구현 순서 + +`03+02_api_parser_map`은 같은 task group의 `02+01_codegen_check`가 `complete.log`를 만든 뒤 시작한다. 이 의존성은 directory name의 `+02`가 source of truth다. + +## 구현 체크리스트 + +- [ ] [API-1] API 내부 contract parser map helper와 unit test를 추가한다. +- [ ] [API-2] socket server construction이 API parser map을 사용하도록 연결하고 module dependency를 정리한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +### [API-1] API contract parser map helper + +#### 문제 + +`../proto-socket/go/communicator.go:20`의 `ParserMap`은 `map[string]func([]byte) (proto.Message, error)`이고, parser가 없으면 `../proto-socket/go/communicator.go:304`에서 error를 반환한다. ALT API에는 generated `alt.v1` messages를 parser map으로 묶는 표준 위치가 없다. + +Before: + +```go +// ../proto-socket/go/communicator.go:304 +func (c *Communicator) parse(typeName string, data []byte) (proto.Message, error) { + c.mu.RLock() + parser := c.parserMap[typeName] + c.mu.RUnlock() + if parser == nil { + return nil, fmt.Errorf("protobuf parser is not registered for type %s", typeName) + } + return parser(data) +} +``` + +해결 후 형태: + +```go +package contracts + +func ParserMap() protoSocket.ParserMap { + return protoSocket.ParserMap{ + protoSocket.TypeNameOf(&altv1.HelloRequest{}): parserFor(func() proto.Message { return &altv1.HelloRequest{} }), + } +} +``` + +#### 해결 방법 + +`services/api/internal/contracts/parser_map.go`를 만들고 generated `altv1` message 전체를 등록한다. request/response/result payload를 모두 포함하고 helper는 map을 새로 반환해 호출자가 mutate해도 package 전역 상태가 생기지 않게 한다. + +#### 수정 파일 및 체크리스트 + +- [ ] `services/api/internal/contracts/parser_map.go`: `ParserMap()`과 shared `parserFor` helper 추가. +- [ ] `services/api/internal/contracts/parser_map_test.go`: map keys와 parse success 검증. +- [ ] `services/api/go.mod`: generated Go module require 추가. + +#### 테스트 작성 + +작성한다. `TestParserMapIncludesAltMessages`는 `HelloRequest`, `HelloResponse`, `ListInstrumentsRequest`, `ListInstrumentsResponse`, `ListBarsRequest`, `ListBarsResponse`, `StartBacktestRequest`, `StartBacktestResponse`, `GetBacktestRunRequest`, `GetBacktestRunResponse`, `GetBacktestResultRequest`, `GetBacktestResultResponse`, `BacktestResult`를 등록/parse한다. + +#### 중간 검증 + +```bash +cd services/api && go test ./internal/contracts +``` + +기대 결과: exit 0. + +### [API-2] Wire parser map into socket server + +#### 문제 + +`services/api/internal/socket/server.go:12`는 `protoSocket.ParserMap{}`를 전달해 ALT payload가 들어와도 parse할 수 없다. + +Before: + +```go +// services/api/internal/socket/server.go:10 +func NewServer(cfg config.Config) *protoSocket.WsServer { + return protoSocket.NewWsServer(cfg.Host, cfg.Port, cfg.SocketPath, func(conn *websocket.Conn) *protoSocket.WsClient { + return protoSocket.NewWsClient(conn, cfg.HeartbeatIntervalSec, cfg.HeartbeatWaitSec, protoSocket.ParserMap{}) + }) +} +``` + +해결 후 형태: + +```go +import ( + apiContracts "git.toki-labs.com/toki/alt/services/api/internal/contracts" +) + +return protoSocket.NewWsClient(conn, cfg.HeartbeatIntervalSec, cfg.HeartbeatWaitSec, apiContracts.ParserMap()) +``` + +#### 해결 방법 + +`server.go`에서 API contracts helper를 import하고 `NewWsClient`에 `apiContracts.ParserMap()`을 전달한다. `go mod tidy`로 generated contract module dependency를 정리한다. + +#### 수정 파일 및 체크리스트 + +- [ ] `services/api/internal/socket/server.go`: empty parser map을 API parser map으로 교체. +- [ ] `services/api/go.mod`: generated contract module dependency 유지. +- [ ] `services/api/go.sum`: 필요한 checksum 변경 반영. + +#### 테스트 작성 + +별도 socket server unit test는 작성하지 않는다. 이 subtask는 parser map helper unit test와 `go test ./...` 컴파일 검증으로 충분하다. 실제 handshake/request-response behavior는 후속 `Socket Session Loop` Milestone 범위다. + +#### 중간 검증 + +```bash +cd services/api && go test ./... +``` + +기대 결과: exit 0. + +## 수정 파일 요약 + +| 파일 | 항목 | +|------|------| +| `services/api/internal/contracts/parser_map.go` | API-1 | +| `services/api/internal/contracts/parser_map_test.go` | API-1 | +| `services/api/internal/socket/server.go` | API-2 | +| `services/api/go.mod` | API-1, API-2 | +| `services/api/go.sum` | API-2 | + +## 최종 검증 + +```bash +cd services/api && go test ./... +bin/test +bin/lint +``` + +기대 결과: 모든 명령 exit 0. Go test cache output은 허용한다. + +모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/agent-task/m-contract-codegen-baseline/04+02_client_parser_map/CODE_REVIEW-cloud-G06.md b/agent-task/m-contract-codegen-baseline/04+02_client_parser_map/CODE_REVIEW-cloud-G06.md new file mode 100644 index 0000000..984fb08 --- /dev/null +++ b/agent-task/m-contract-codegen-baseline/04+02_client_parser_map/CODE_REVIEW-cloud-G06.md @@ -0,0 +1,113 @@ + + +# Code Review Reference - API + +> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.** +> The task is NOT complete until every implementation-owned section below is filled in. +> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving. +> Fill implementation-owned sections, then stop with active files in place and report ready for review. +> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume. +> Follow the ownership table at the bottom of this file for which sections you own. + +## 개요 + +date=2026-05-28 +task=m-contract-codegen-baseline/04+02_client_parser_map, plan=0, tag=API + +## 이 파일을 읽는 리뷰 에이전트에게 + +> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다. + +각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. +리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다. + +1. 판정을 append한다. +2. `CODE_REVIEW-cloud-G06.md` → `code_review_cloud_G06_N.log`, `PLAN-cloud-G06.md` → `plan_cloud_G06_M.log`로 아카이브한다. +3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-contract-codegen-baseline/04+02_client_parser_map/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 사용자 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다. +4. PASS이고 task group이 `m-`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다. +5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다. + +--- + +## 구현 항목별 완료 여부 + +| 항목 | 완료 여부 | +|------|---------| +| [API-1] Flutter parser map helper | [ ] | +| [API-2] Client contract location documentation | [ ] | + +## 구현 체크리스트 + +- [ ] [API-1] Flutter client contract parser map helper와 unit test를 추가한다. +- [ ] [API-2] client README에 generated contract와 parser map 표준 위치를 문서화한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 코드리뷰 전용 체크리스트 + +> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. +> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다. + +- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. +- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다. +- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G06_N.log`로 아카이브한다. +- [ ] active `PLAN-*-G??.md`를 `plan_cloud_G06_M.log`로 아카이브한다. +- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다. +- [ ] PASS이면 active task 디렉터리 `agent-task/m-contract-codegen-baseline/04+02_client_parser_map/`를 `agent-task/archive/YYYY/MM/m-contract-codegen-baseline/04+02_client_parser_map/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다. +- [ ] PASS이고 task group이 `m-`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다. +- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-contract-codegen-baseline/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다. +- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G06.md`와 `CODE_REVIEW-cloud-G06.md`를 작성하고 `complete.log`를 작성하지 않는다. +- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다. +- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다. + +## 계획 대비 변경 사항 + +_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ + +## 주요 설계 결정 + +_구현 에이전트가 주요 설계 결정 사항을 기록한다._ + +## 리뷰어를 위한 체크포인트 + +- Client parser map이 generated message qualified names를 key로 쓰는지 확인한다. +- Helper가 presentation/UI layer에 의존하지 않는지 확인한다. +- Test가 generated Dart files를 실제 import/parse하는지 확인한다. + +## 검증 결과 + +_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._ + +필수 규칙: +- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다. +- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다. +- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다. + +### API-1 중간 검증 +```bash +$ cd apps/client && flutter test test/contracts/alt_contracts_test.dart +(output) +``` + +### API-2 중간 검증 +```bash +$ rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md +(output) +``` + +### 최종 검증 +```bash +$ cd apps/client && flutter test test/contracts/alt_contracts_test.dart +(output) +$ rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md +(output) +$ bin/test +(output) +$ bin/lint +(output) +``` + +--- + +> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?** +> If anything is blank, go back and fill it in before saving this file. +> Leave review-agent-only sections unchanged. diff --git a/agent-task/m-contract-codegen-baseline/04+02_client_parser_map/PLAN-cloud-G06.md b/agent-task/m-contract-codegen-baseline/04+02_client_parser_map/PLAN-cloud-G06.md new file mode 100644 index 0000000..cf2ccc9 --- /dev/null +++ b/agent-task/m-contract-codegen-baseline/04+02_client_parser_map/PLAN-cloud-G06.md @@ -0,0 +1,184 @@ + + +# Plan - Client Parser Map + +## 이 파일을 읽는 구현 에이전트에게 + +`CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 반드시 채운다. 검증 명령을 실행하고 실제 stdout/stderr를 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 최종화는 code-review 스킬 전용이다. + +## 배경 + +Flutter client는 generated ALT contracts를 소비해야 하지만 현재 parser map 표준 위치가 없다. `02+01_codegen_check`가 Dart generated output을 만든 뒤, `lib/src/contracts`에 작은 helper를 두면 후속 socket client adoption이 UI와 generated code를 직접 엮지 않아도 된다. + +## 분석 결과 + +### 읽은 파일 + +- `agent-roadmap/current.md` +- `agent-roadmap/phase/foundation-alignment/PHASE.md` +- `agent-roadmap/phase/foundation-alignment/milestones/contract-codegen-baseline.md` +- `agent-ops/rules/project/domain/client/rules.md` +- `agent-ops/rules/project/domain/contracts/rules.md` +- `apps/client/pubspec.yaml` +- `apps/client/README.md` +- `apps/client/lib/main.dart` +- `apps/client/lib/src/app/app.dart` +- `apps/client/lib/src/app/router.dart` +- `apps/client/lib/src/features/dashboard/presentation/dashboard_screen.dart` +- `apps/client/test/widget_test.dart` +- `packages/contracts/proto/alt/v1/common.proto` +- `packages/contracts/proto/alt/v1/market.proto` +- `packages/contracts/proto/alt/v1/backtest.proto` +- `../proto-socket/dart/lib/src/communicator.dart` +- `bin/test` +- `bin/lint` + +### 테스트 커버리지 공백 + +- Client parser map helper: 기존 테스트 없음. 새 Dart unit test가 qualified message name keys와 fromBuffer parse success를 검증해야 한다. +- Generated Dart import stability: 기존 widget test는 generated contracts를 import하지 않는다. 새 parser map test가 generated files를 컴파일 경로에 포함한다. + +### 심볼 참조 + +- renamed/removed symbols: none. + +### 분할 판단 + +분할 정책을 먼저 평가했다. 이 plan은 `04+02_client_parser_map`이며 `02+01_codegen_check`가 `complete.log`를 만든 뒤 시작한다. API parser map은 별도 `03+02_api_parser_map`으로 분리되어 있고, 두 subtask는 codegen 이후 병렬 가능하다. + +### 범위 결정 근거 + +이 subtask는 `apps/client/lib/src/contracts`, generated Dart imports, client tests, client README만 다룬다. Socket connection lifecycle, WebSocket configuration, UI state, Go API 변경은 범위 밖이다. + +### 빌드 등급 + +build=`cloud-G06`, review=`cloud-G06`. Generated Dart contracts와 proto-socket wire type conventions를 client boundary에 묶는 protocol/client 작업이다. + +## 의존 관계 및 구현 순서 + +`04+02_client_parser_map`은 같은 task group의 `02+01_codegen_check`가 `complete.log`를 만든 뒤 시작한다. 이 의존성은 directory name의 `+02`가 source of truth다. + +## 구현 체크리스트 + +- [ ] [API-1] Flutter client contract parser map helper와 unit test를 추가한다. +- [ ] [API-2] client README에 generated contract와 parser map 표준 위치를 문서화한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +### [API-1] Flutter parser map helper + +#### 문제 + +`apps/client/README.md:5`는 ALT protobuf bindings를 `lib/src` 아래에 추가하라고만 안내한다. `../proto-socket/dart/lib/src/communicator.dart:45`는 `Map)>` parser map을 요구하고, `../proto-socket/dart/lib/src/communicator.dart:98`은 outgoing `typeName`에 `data.info_.qualifiedMessageName`을 쓴다. Client에는 generated ALT messages의 qualified names를 모으는 helper가 없다. + +Before: + +```markdown + +This app uses Riverpod for state and dependency boundaries, and `go_router` for navigation. ALT protobuf bindings and the proto-socket client layer should be added under `lib/src` after `packages/contracts` generation is introduced. +``` + +```dart +// ../proto-socket/dart/lib/src/communicator.dart:45 +void initialize( + Map)> instanceGenerator, + {required Transport transport}) { + _instanceGenerator = instanceGenerator; + _transport = transport; +} +``` + +해결 후 형태: + +```dart +import 'package:protobuf/protobuf.dart'; + +Map)> altParserMap() { + return { + HelloRequest.getDefault().info_.qualifiedMessageName: HelloRequest.fromBuffer, + HelloResponse.getDefault().info_.qualifiedMessageName: HelloResponse.fromBuffer, + }; +} +``` + +#### 해결 방법 + +`apps/client/lib/src/contracts/alt_contracts.dart`를 만들고 generated `common.pb.dart`, `market.pb.dart`, `backtest.pb.dart`의 request/response/result message를 등록한다. helper는 새 map을 반환하고, UI/presentation layer에는 import하지 않는다. + +#### 수정 파일 및 체크리스트 + +- [ ] `apps/client/lib/src/contracts/alt_contracts.dart`: `altParserMap()` 추가. +- [ ] `apps/client/test/contracts/alt_contracts_test.dart`: qualified key와 parse success 검증. + +#### 테스트 작성 + +작성한다. `altParserMap contains generated ALT message parsers`는 `HelloRequest`, `HelloResponse`, `ListInstrumentsRequest`, `ListInstrumentsResponse`, `ListBarsRequest`, `ListBarsResponse`, `StartBacktestRequest`, `StartBacktestResponse`, `GetBacktestRunRequest`, `GetBacktestRunResponse`, `GetBacktestResultRequest`, `GetBacktestResultResponse`, `BacktestResult`를 map에서 찾아 `fromBuffer` round-trip으로 검증한다. + +#### 중간 검증 + +```bash +cd apps/client && flutter test test/contracts/alt_contracts_test.dart +``` + +기대 결과: exit 0. + +### [API-2] Client contract location documentation + +#### 문제 + +`apps/client/README.md:5`의 문장은 codegen 도입 전 placeholder라서 generated output path와 parser map helper 위치를 알려주지 않는다. + +Before: + +```markdown + +ALT protobuf bindings and the proto-socket client layer should be added under `lib/src` after `packages/contracts` generation is introduced. +``` + +해결 후 형태: + +```markdown +Generated ALT protobuf files live under `lib/src/generated/alt/v1`. +Client parser map helpers live under `lib/src/contracts`. +Do not edit generated files by hand; run `../../bin/contracts-gen`. +``` + +#### 해결 방법 + +README에 generated output path, parser map helper path, regeneration command만 짧게 남긴다. + +#### 수정 파일 및 체크리스트 + +- [ ] `apps/client/README.md`: generated contract and parser map section 추가. + +#### 테스트 작성 + +문서 변경이므로 테스트 파일은 작성하지 않는다. deterministic search로 앵커 존재를 확인한다. + +#### 중간 검증 + +```bash +rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md +``` + +기대 결과: 모든 앵커가 검색된다. + +## 수정 파일 요약 + +| 파일 | 항목 | +|------|------| +| `apps/client/lib/src/contracts/alt_contracts.dart` | API-1 | +| `apps/client/test/contracts/alt_contracts_test.dart` | API-1 | +| `apps/client/README.md` | API-2 | + +## 최종 검증 + +```bash +cd apps/client && flutter test test/contracts/alt_contracts_test.dart +rg --sort path -n "lib/src/generated/alt/v1|lib/src/contracts|contracts-gen" apps/client/README.md +bin/test +bin/lint +``` + +기대 결과: 모든 명령 exit 0. Flutter test cache output은 해당 없음. + +모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/apps/client/lib/src/generated/alt/v1/backtest.pb.dart b/apps/client/lib/src/generated/alt/v1/backtest.pb.dart new file mode 100644 index 0000000..78484a4 --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/backtest.pb.dart @@ -0,0 +1,664 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/backtest.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +import 'backtest.pbenum.dart'; +import 'common.pbenum.dart' as $1; +import 'market.pb.dart' as $0; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +export 'backtest.pbenum.dart'; + +class BacktestRunSpec extends $pb.GeneratedMessage { + factory BacktestRunSpec({ + $core.String? strategyId, + $1.Market? market, + $1.Timeframe? timeframe, + $fixnum.Int64? fromUnixMs, + $fixnum.Int64? toUnixMs, + }) { + final result = create(); + if (strategyId != null) result.strategyId = strategyId; + if (market != null) result.market = market; + if (timeframe != null) result.timeframe = timeframe; + if (fromUnixMs != null) result.fromUnixMs = fromUnixMs; + if (toUnixMs != null) result.toUnixMs = toUnixMs; + return result; + } + + BacktestRunSpec._(); + + factory BacktestRunSpec.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BacktestRunSpec.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BacktestRunSpec', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'strategyId') + ..aE<$1.Market>(2, _omitFieldNames ? '' : 'market', + enumValues: $1.Market.values) + ..aE<$1.Timeframe>(3, _omitFieldNames ? '' : 'timeframe', + enumValues: $1.Timeframe.values) + ..aInt64(4, _omitFieldNames ? '' : 'fromUnixMs') + ..aInt64(5, _omitFieldNames ? '' : 'toUnixMs') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BacktestRunSpec clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BacktestRunSpec copyWith(void Function(BacktestRunSpec) updates) => + super.copyWith((message) => updates(message as BacktestRunSpec)) + as BacktestRunSpec; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BacktestRunSpec create() => BacktestRunSpec._(); + @$core.override + BacktestRunSpec createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static BacktestRunSpec getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static BacktestRunSpec? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get strategyId => $_getSZ(0); + @$pb.TagNumber(1) + set strategyId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasStrategyId() => $_has(0); + @$pb.TagNumber(1) + void clearStrategyId() => $_clearField(1); + + @$pb.TagNumber(2) + $1.Market get market => $_getN(1); + @$pb.TagNumber(2) + set market($1.Market value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasMarket() => $_has(1); + @$pb.TagNumber(2) + void clearMarket() => $_clearField(2); + + @$pb.TagNumber(3) + $1.Timeframe get timeframe => $_getN(2); + @$pb.TagNumber(3) + set timeframe($1.Timeframe value) => $_setField(3, value); + @$pb.TagNumber(3) + $core.bool hasTimeframe() => $_has(2); + @$pb.TagNumber(3) + void clearTimeframe() => $_clearField(3); + + @$pb.TagNumber(4) + $fixnum.Int64 get fromUnixMs => $_getI64(3); + @$pb.TagNumber(4) + set fromUnixMs($fixnum.Int64 value) => $_setInt64(3, value); + @$pb.TagNumber(4) + $core.bool hasFromUnixMs() => $_has(3); + @$pb.TagNumber(4) + void clearFromUnixMs() => $_clearField(4); + + @$pb.TagNumber(5) + $fixnum.Int64 get toUnixMs => $_getI64(4); + @$pb.TagNumber(5) + set toUnixMs($fixnum.Int64 value) => $_setInt64(4, value); + @$pb.TagNumber(5) + $core.bool hasToUnixMs() => $_has(4); + @$pb.TagNumber(5) + void clearToUnixMs() => $_clearField(5); +} + +class BacktestRun extends $pb.GeneratedMessage { + factory BacktestRun({ + $core.String? id, + BacktestRunSpec? spec, + BacktestRunStatus? status, + $fixnum.Int64? createdAtUnixMs, + $fixnum.Int64? updatedAtUnixMs, + }) { + final result = create(); + if (id != null) result.id = id; + if (spec != null) result.spec = spec; + if (status != null) result.status = status; + if (createdAtUnixMs != null) result.createdAtUnixMs = createdAtUnixMs; + if (updatedAtUnixMs != null) result.updatedAtUnixMs = updatedAtUnixMs; + return result; + } + + BacktestRun._(); + + factory BacktestRun.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BacktestRun.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BacktestRun', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'id') + ..aOM(2, _omitFieldNames ? '' : 'spec', + subBuilder: BacktestRunSpec.create) + ..aE(3, _omitFieldNames ? '' : 'status', + enumValues: BacktestRunStatus.values) + ..aInt64(4, _omitFieldNames ? '' : 'createdAtUnixMs') + ..aInt64(5, _omitFieldNames ? '' : 'updatedAtUnixMs') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BacktestRun clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BacktestRun copyWith(void Function(BacktestRun) updates) => + super.copyWith((message) => updates(message as BacktestRun)) + as BacktestRun; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BacktestRun create() => BacktestRun._(); + @$core.override + BacktestRun createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static BacktestRun getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static BacktestRun? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => $_clearField(1); + + @$pb.TagNumber(2) + BacktestRunSpec get spec => $_getN(1); + @$pb.TagNumber(2) + set spec(BacktestRunSpec value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasSpec() => $_has(1); + @$pb.TagNumber(2) + void clearSpec() => $_clearField(2); + @$pb.TagNumber(2) + BacktestRunSpec ensureSpec() => $_ensure(1); + + @$pb.TagNumber(3) + BacktestRunStatus get status => $_getN(2); + @$pb.TagNumber(3) + set status(BacktestRunStatus value) => $_setField(3, value); + @$pb.TagNumber(3) + $core.bool hasStatus() => $_has(2); + @$pb.TagNumber(3) + void clearStatus() => $_clearField(3); + + @$pb.TagNumber(4) + $fixnum.Int64 get createdAtUnixMs => $_getI64(3); + @$pb.TagNumber(4) + set createdAtUnixMs($fixnum.Int64 value) => $_setInt64(3, value); + @$pb.TagNumber(4) + $core.bool hasCreatedAtUnixMs() => $_has(3); + @$pb.TagNumber(4) + void clearCreatedAtUnixMs() => $_clearField(4); + + @$pb.TagNumber(5) + $fixnum.Int64 get updatedAtUnixMs => $_getI64(4); + @$pb.TagNumber(5) + set updatedAtUnixMs($fixnum.Int64 value) => $_setInt64(4, value); + @$pb.TagNumber(5) + $core.bool hasUpdatedAtUnixMs() => $_has(4); + @$pb.TagNumber(5) + void clearUpdatedAtUnixMs() => $_clearField(5); +} + +class StartBacktestRequest extends $pb.GeneratedMessage { + factory StartBacktestRequest({ + BacktestRunSpec? spec, + }) { + final result = create(); + if (spec != null) result.spec = spec; + return result; + } + + StartBacktestRequest._(); + + factory StartBacktestRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory StartBacktestRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'StartBacktestRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'spec', + subBuilder: BacktestRunSpec.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StartBacktestRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StartBacktestRequest copyWith(void Function(StartBacktestRequest) updates) => + super.copyWith((message) => updates(message as StartBacktestRequest)) + as StartBacktestRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static StartBacktestRequest create() => StartBacktestRequest._(); + @$core.override + StartBacktestRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static StartBacktestRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static StartBacktestRequest? _defaultInstance; + + @$pb.TagNumber(1) + BacktestRunSpec get spec => $_getN(0); + @$pb.TagNumber(1) + set spec(BacktestRunSpec value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasSpec() => $_has(0); + @$pb.TagNumber(1) + void clearSpec() => $_clearField(1); + @$pb.TagNumber(1) + BacktestRunSpec ensureSpec() => $_ensure(0); +} + +class StartBacktestResponse extends $pb.GeneratedMessage { + factory StartBacktestResponse({ + BacktestRun? run, + }) { + final result = create(); + if (run != null) result.run = run; + return result; + } + + StartBacktestResponse._(); + + factory StartBacktestResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory StartBacktestResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'StartBacktestResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'run', + subBuilder: BacktestRun.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StartBacktestResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + StartBacktestResponse copyWith( + void Function(StartBacktestResponse) updates) => + super.copyWith((message) => updates(message as StartBacktestResponse)) + as StartBacktestResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static StartBacktestResponse create() => StartBacktestResponse._(); + @$core.override + StartBacktestResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static StartBacktestResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static StartBacktestResponse? _defaultInstance; + + @$pb.TagNumber(1) + BacktestRun get run => $_getN(0); + @$pb.TagNumber(1) + set run(BacktestRun value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasRun() => $_has(0); + @$pb.TagNumber(1) + void clearRun() => $_clearField(1); + @$pb.TagNumber(1) + BacktestRun ensureRun() => $_ensure(0); +} + +class GetBacktestRunRequest extends $pb.GeneratedMessage { + factory GetBacktestRunRequest({ + $core.String? runId, + }) { + final result = create(); + if (runId != null) result.runId = runId; + return result; + } + + GetBacktestRunRequest._(); + + factory GetBacktestRunRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetBacktestRunRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetBacktestRunRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'runId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestRunRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestRunRequest copyWith( + void Function(GetBacktestRunRequest) updates) => + super.copyWith((message) => updates(message as GetBacktestRunRequest)) + as GetBacktestRunRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetBacktestRunRequest create() => GetBacktestRunRequest._(); + @$core.override + GetBacktestRunRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static GetBacktestRunRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetBacktestRunRequest? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get runId => $_getSZ(0); + @$pb.TagNumber(1) + set runId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasRunId() => $_has(0); + @$pb.TagNumber(1) + void clearRunId() => $_clearField(1); +} + +class GetBacktestRunResponse extends $pb.GeneratedMessage { + factory GetBacktestRunResponse({ + BacktestRun? run, + }) { + final result = create(); + if (run != null) result.run = run; + return result; + } + + GetBacktestRunResponse._(); + + factory GetBacktestRunResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetBacktestRunResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetBacktestRunResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'run', + subBuilder: BacktestRun.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestRunResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestRunResponse copyWith( + void Function(GetBacktestRunResponse) updates) => + super.copyWith((message) => updates(message as GetBacktestRunResponse)) + as GetBacktestRunResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetBacktestRunResponse create() => GetBacktestRunResponse._(); + @$core.override + GetBacktestRunResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static GetBacktestRunResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetBacktestRunResponse? _defaultInstance; + + @$pb.TagNumber(1) + BacktestRun get run => $_getN(0); + @$pb.TagNumber(1) + set run(BacktestRun value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasRun() => $_has(0); + @$pb.TagNumber(1) + void clearRun() => $_clearField(1); + @$pb.TagNumber(1) + BacktestRun ensureRun() => $_ensure(0); +} + +class BacktestResult extends $pb.GeneratedMessage { + factory BacktestResult({ + $core.String? runId, + $0.Price? startingCash, + $0.Price? endingEquity, + }) { + final result = create(); + if (runId != null) result.runId = runId; + if (startingCash != null) result.startingCash = startingCash; + if (endingEquity != null) result.endingEquity = endingEquity; + return result; + } + + BacktestResult._(); + + factory BacktestResult.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BacktestResult.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BacktestResult', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'runId') + ..aOM<$0.Price>(2, _omitFieldNames ? '' : 'startingCash', + subBuilder: $0.Price.create) + ..aOM<$0.Price>(3, _omitFieldNames ? '' : 'endingEquity', + subBuilder: $0.Price.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BacktestResult clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BacktestResult copyWith(void Function(BacktestResult) updates) => + super.copyWith((message) => updates(message as BacktestResult)) + as BacktestResult; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BacktestResult create() => BacktestResult._(); + @$core.override + BacktestResult createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static BacktestResult getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static BacktestResult? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get runId => $_getSZ(0); + @$pb.TagNumber(1) + set runId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasRunId() => $_has(0); + @$pb.TagNumber(1) + void clearRunId() => $_clearField(1); + + @$pb.TagNumber(2) + $0.Price get startingCash => $_getN(1); + @$pb.TagNumber(2) + set startingCash($0.Price value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasStartingCash() => $_has(1); + @$pb.TagNumber(2) + void clearStartingCash() => $_clearField(2); + @$pb.TagNumber(2) + $0.Price ensureStartingCash() => $_ensure(1); + + @$pb.TagNumber(3) + $0.Price get endingEquity => $_getN(2); + @$pb.TagNumber(3) + set endingEquity($0.Price value) => $_setField(3, value); + @$pb.TagNumber(3) + $core.bool hasEndingEquity() => $_has(2); + @$pb.TagNumber(3) + void clearEndingEquity() => $_clearField(3); + @$pb.TagNumber(3) + $0.Price ensureEndingEquity() => $_ensure(2); +} + +class GetBacktestResultRequest extends $pb.GeneratedMessage { + factory GetBacktestResultRequest({ + $core.String? runId, + }) { + final result = create(); + if (runId != null) result.runId = runId; + return result; + } + + GetBacktestResultRequest._(); + + factory GetBacktestResultRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetBacktestResultRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetBacktestResultRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'runId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestResultRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestResultRequest copyWith( + void Function(GetBacktestResultRequest) updates) => + super.copyWith((message) => updates(message as GetBacktestResultRequest)) + as GetBacktestResultRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetBacktestResultRequest create() => GetBacktestResultRequest._(); + @$core.override + GetBacktestResultRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static GetBacktestResultRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetBacktestResultRequest? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get runId => $_getSZ(0); + @$pb.TagNumber(1) + set runId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasRunId() => $_has(0); + @$pb.TagNumber(1) + void clearRunId() => $_clearField(1); +} + +class GetBacktestResultResponse extends $pb.GeneratedMessage { + factory GetBacktestResultResponse({ + BacktestResult? result, + }) { + final result$ = create(); + if (result != null) result$.result = result; + return result$; + } + + GetBacktestResultResponse._(); + + factory GetBacktestResultResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory GetBacktestResultResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'GetBacktestResultResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOM(1, _omitFieldNames ? '' : 'result', + subBuilder: BacktestResult.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestResultResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + GetBacktestResultResponse copyWith( + void Function(GetBacktestResultResponse) updates) => + super.copyWith((message) => updates(message as GetBacktestResultResponse)) + as GetBacktestResultResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static GetBacktestResultResponse create() => GetBacktestResultResponse._(); + @$core.override + GetBacktestResultResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static GetBacktestResultResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static GetBacktestResultResponse? _defaultInstance; + + @$pb.TagNumber(1) + BacktestResult get result => $_getN(0); + @$pb.TagNumber(1) + set result(BacktestResult value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasResult() => $_has(0); + @$pb.TagNumber(1) + void clearResult() => $_clearField(1); + @$pb.TagNumber(1) + BacktestResult ensureResult() => $_ensure(0); +} + +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/apps/client/lib/src/generated/alt/v1/backtest.pbenum.dart b/apps/client/lib/src/generated/alt/v1/backtest.pbenum.dart new file mode 100644 index 0000000..1511fb8 --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/backtest.pbenum.dart @@ -0,0 +1,55 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/backtest.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +class BacktestRunStatus extends $pb.ProtobufEnum { + static const BacktestRunStatus BACKTEST_RUN_STATUS_UNSPECIFIED = + BacktestRunStatus._( + 0, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_UNSPECIFIED'); + static const BacktestRunStatus BACKTEST_RUN_STATUS_PENDING = + BacktestRunStatus._( + 1, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_PENDING'); + static const BacktestRunStatus BACKTEST_RUN_STATUS_RUNNING = + BacktestRunStatus._( + 2, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_RUNNING'); + static const BacktestRunStatus BACKTEST_RUN_STATUS_SUCCEEDED = + BacktestRunStatus._( + 3, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_SUCCEEDED'); + static const BacktestRunStatus BACKTEST_RUN_STATUS_FAILED = + BacktestRunStatus._( + 4, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_FAILED'); + static const BacktestRunStatus BACKTEST_RUN_STATUS_CANCELED = + BacktestRunStatus._( + 5, _omitEnumNames ? '' : 'BACKTEST_RUN_STATUS_CANCELED'); + + static const $core.List values = [ + BACKTEST_RUN_STATUS_UNSPECIFIED, + BACKTEST_RUN_STATUS_PENDING, + BACKTEST_RUN_STATUS_RUNNING, + BACKTEST_RUN_STATUS_SUCCEEDED, + BACKTEST_RUN_STATUS_FAILED, + BACKTEST_RUN_STATUS_CANCELED, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 5); + static BacktestRunStatus? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const BacktestRunStatus._(super.value, super.name); +} + +const $core.bool _omitEnumNames = + $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/apps/client/lib/src/generated/alt/v1/backtest.pbjson.dart b/apps/client/lib/src/generated/alt/v1/backtest.pbjson.dart new file mode 100644 index 0000000..6ba530c --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/backtest.pbjson.dart @@ -0,0 +1,253 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/backtest.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports +// ignore_for_file: unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use backtestRunStatusDescriptor instead') +const BacktestRunStatus$json = { + '1': 'BacktestRunStatus', + '2': [ + {'1': 'BACKTEST_RUN_STATUS_UNSPECIFIED', '2': 0}, + {'1': 'BACKTEST_RUN_STATUS_PENDING', '2': 1}, + {'1': 'BACKTEST_RUN_STATUS_RUNNING', '2': 2}, + {'1': 'BACKTEST_RUN_STATUS_SUCCEEDED', '2': 3}, + {'1': 'BACKTEST_RUN_STATUS_FAILED', '2': 4}, + {'1': 'BACKTEST_RUN_STATUS_CANCELED', '2': 5}, + ], +}; + +/// Descriptor for `BacktestRunStatus`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List backtestRunStatusDescriptor = $convert.base64Decode( + 'ChFCYWNrdGVzdFJ1blN0YXR1cxIjCh9CQUNLVEVTVF9SVU5fU1RBVFVTX1VOU1BFQ0lGSUVEEA' + 'ASHwobQkFDS1RFU1RfUlVOX1NUQVRVU19QRU5ESU5HEAESHwobQkFDS1RFU1RfUlVOX1NUQVRV' + 'U19SVU5OSU5HEAISIQodQkFDS1RFU1RfUlVOX1NUQVRVU19TVUNDRUVERUQQAxIeChpCQUNLVE' + 'VTVF9SVU5fU1RBVFVTX0ZBSUxFRBAEEiAKHEJBQ0tURVNUX1JVTl9TVEFUVVNfQ0FOQ0VMRUQQ' + 'BQ=='); + +@$core.Deprecated('Use backtestRunSpecDescriptor instead') +const BacktestRunSpec$json = { + '1': 'BacktestRunSpec', + '2': [ + {'1': 'strategy_id', '3': 1, '4': 1, '5': 9, '10': 'strategyId'}, + { + '1': 'market', + '3': 2, + '4': 1, + '5': 14, + '6': '.alt.v1.Market', + '10': 'market' + }, + { + '1': 'timeframe', + '3': 3, + '4': 1, + '5': 14, + '6': '.alt.v1.Timeframe', + '10': 'timeframe' + }, + {'1': 'from_unix_ms', '3': 4, '4': 1, '5': 3, '10': 'fromUnixMs'}, + {'1': 'to_unix_ms', '3': 5, '4': 1, '5': 3, '10': 'toUnixMs'}, + ], +}; + +/// Descriptor for `BacktestRunSpec`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List backtestRunSpecDescriptor = $convert.base64Decode( + 'Cg9CYWNrdGVzdFJ1blNwZWMSHwoLc3RyYXRlZ3lfaWQYASABKAlSCnN0cmF0ZWd5SWQSJgoGbW' + 'Fya2V0GAIgASgOMg4uYWx0LnYxLk1hcmtldFIGbWFya2V0Ei8KCXRpbWVmcmFtZRgDIAEoDjIR' + 'LmFsdC52MS5UaW1lZnJhbWVSCXRpbWVmcmFtZRIgCgxmcm9tX3VuaXhfbXMYBCABKANSCmZyb2' + '1Vbml4TXMSHAoKdG9fdW5peF9tcxgFIAEoA1IIdG9Vbml4TXM='); + +@$core.Deprecated('Use backtestRunDescriptor instead') +const BacktestRun$json = { + '1': 'BacktestRun', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + { + '1': 'spec', + '3': 2, + '4': 1, + '5': 11, + '6': '.alt.v1.BacktestRunSpec', + '10': 'spec' + }, + { + '1': 'status', + '3': 3, + '4': 1, + '5': 14, + '6': '.alt.v1.BacktestRunStatus', + '10': 'status' + }, + { + '1': 'created_at_unix_ms', + '3': 4, + '4': 1, + '5': 3, + '10': 'createdAtUnixMs' + }, + { + '1': 'updated_at_unix_ms', + '3': 5, + '4': 1, + '5': 3, + '10': 'updatedAtUnixMs' + }, + ], +}; + +/// Descriptor for `BacktestRun`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List backtestRunDescriptor = $convert.base64Decode( + 'CgtCYWNrdGVzdFJ1bhIOCgJpZBgBIAEoCVICaWQSKwoEc3BlYxgCIAEoCzIXLmFsdC52MS5CYW' + 'NrdGVzdFJ1blNwZWNSBHNwZWMSMQoGc3RhdHVzGAMgASgOMhkuYWx0LnYxLkJhY2t0ZXN0UnVu' + 'U3RhdHVzUgZzdGF0dXMSKwoSY3JlYXRlZF9hdF91bml4X21zGAQgASgDUg9jcmVhdGVkQXRVbm' + 'l4TXMSKwoSdXBkYXRlZF9hdF91bml4X21zGAUgASgDUg91cGRhdGVkQXRVbml4TXM='); + +@$core.Deprecated('Use startBacktestRequestDescriptor instead') +const StartBacktestRequest$json = { + '1': 'StartBacktestRequest', + '2': [ + { + '1': 'spec', + '3': 1, + '4': 1, + '5': 11, + '6': '.alt.v1.BacktestRunSpec', + '10': 'spec' + }, + ], +}; + +/// Descriptor for `StartBacktestRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List startBacktestRequestDescriptor = $convert.base64Decode( + 'ChRTdGFydEJhY2t0ZXN0UmVxdWVzdBIrCgRzcGVjGAEgASgLMhcuYWx0LnYxLkJhY2t0ZXN0Un' + 'VuU3BlY1IEc3BlYw=='); + +@$core.Deprecated('Use startBacktestResponseDescriptor instead') +const StartBacktestResponse$json = { + '1': 'StartBacktestResponse', + '2': [ + { + '1': 'run', + '3': 1, + '4': 1, + '5': 11, + '6': '.alt.v1.BacktestRun', + '10': 'run' + }, + ], +}; + +/// Descriptor for `StartBacktestResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List startBacktestResponseDescriptor = $convert.base64Decode( + 'ChVTdGFydEJhY2t0ZXN0UmVzcG9uc2USJQoDcnVuGAEgASgLMhMuYWx0LnYxLkJhY2t0ZXN0Un' + 'VuUgNydW4='); + +@$core.Deprecated('Use getBacktestRunRequestDescriptor instead') +const GetBacktestRunRequest$json = { + '1': 'GetBacktestRunRequest', + '2': [ + {'1': 'run_id', '3': 1, '4': 1, '5': 9, '10': 'runId'}, + ], +}; + +/// Descriptor for `GetBacktestRunRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getBacktestRunRequestDescriptor = + $convert.base64Decode( + 'ChVHZXRCYWNrdGVzdFJ1blJlcXVlc3QSFQoGcnVuX2lkGAEgASgJUgVydW5JZA=='); + +@$core.Deprecated('Use getBacktestRunResponseDescriptor instead') +const GetBacktestRunResponse$json = { + '1': 'GetBacktestRunResponse', + '2': [ + { + '1': 'run', + '3': 1, + '4': 1, + '5': 11, + '6': '.alt.v1.BacktestRun', + '10': 'run' + }, + ], +}; + +/// Descriptor for `GetBacktestRunResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getBacktestRunResponseDescriptor = + $convert.base64Decode( + 'ChZHZXRCYWNrdGVzdFJ1blJlc3BvbnNlEiUKA3J1bhgBIAEoCzITLmFsdC52MS5CYWNrdGVzdF' + 'J1blIDcnVu'); + +@$core.Deprecated('Use backtestResultDescriptor instead') +const BacktestResult$json = { + '1': 'BacktestResult', + '2': [ + {'1': 'run_id', '3': 1, '4': 1, '5': 9, '10': 'runId'}, + { + '1': 'starting_cash', + '3': 2, + '4': 1, + '5': 11, + '6': '.alt.v1.Price', + '10': 'startingCash' + }, + { + '1': 'ending_equity', + '3': 3, + '4': 1, + '5': 11, + '6': '.alt.v1.Price', + '10': 'endingEquity' + }, + ], +}; + +/// Descriptor for `BacktestResult`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List backtestResultDescriptor = $convert.base64Decode( + 'Cg5CYWNrdGVzdFJlc3VsdBIVCgZydW5faWQYASABKAlSBXJ1bklkEjIKDXN0YXJ0aW5nX2Nhc2' + 'gYAiABKAsyDS5hbHQudjEuUHJpY2VSDHN0YXJ0aW5nQ2FzaBIyCg1lbmRpbmdfZXF1aXR5GAMg' + 'ASgLMg0uYWx0LnYxLlByaWNlUgxlbmRpbmdFcXVpdHk='); + +@$core.Deprecated('Use getBacktestResultRequestDescriptor instead') +const GetBacktestResultRequest$json = { + '1': 'GetBacktestResultRequest', + '2': [ + {'1': 'run_id', '3': 1, '4': 1, '5': 9, '10': 'runId'}, + ], +}; + +/// Descriptor for `GetBacktestResultRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getBacktestResultRequestDescriptor = + $convert.base64Decode( + 'ChhHZXRCYWNrdGVzdFJlc3VsdFJlcXVlc3QSFQoGcnVuX2lkGAEgASgJUgVydW5JZA=='); + +@$core.Deprecated('Use getBacktestResultResponseDescriptor instead') +const GetBacktestResultResponse$json = { + '1': 'GetBacktestResultResponse', + '2': [ + { + '1': 'result', + '3': 1, + '4': 1, + '5': 11, + '6': '.alt.v1.BacktestResult', + '10': 'result' + }, + ], +}; + +/// Descriptor for `GetBacktestResultResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List getBacktestResultResponseDescriptor = + $convert.base64Decode( + 'ChlHZXRCYWNrdGVzdFJlc3VsdFJlc3BvbnNlEi4KBnJlc3VsdBgBIAEoCzIWLmFsdC52MS5CYW' + 'NrdGVzdFJlc3VsdFIGcmVzdWx0'); diff --git a/apps/client/lib/src/generated/alt/v1/common.pb.dart b/apps/client/lib/src/generated/alt/v1/common.pb.dart new file mode 100644 index 0000000..3a6f5fd --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/common.pb.dart @@ -0,0 +1,306 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/common.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +export 'common.pbenum.dart'; + +class Decimal extends $pb.GeneratedMessage { + factory Decimal({ + $core.String? value, + }) { + final result = create(); + if (value != null) result.value = value; + return result; + } + + Decimal._(); + + factory Decimal.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Decimal.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Decimal', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'value') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Decimal clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Decimal copyWith(void Function(Decimal) updates) => + super.copyWith((message) => updates(message as Decimal)) as Decimal; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Decimal create() => Decimal._(); + @$core.override + Decimal createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static Decimal getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Decimal? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get value => $_getSZ(0); + @$pb.TagNumber(1) + set value($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasValue() => $_has(0); + @$pb.TagNumber(1) + void clearValue() => $_clearField(1); +} + +class ErrorInfo extends $pb.GeneratedMessage { + factory ErrorInfo({ + $core.String? code, + $core.String? message, + }) { + final result = create(); + if (code != null) result.code = code; + if (message != null) result.message = message; + return result; + } + + ErrorInfo._(); + + factory ErrorInfo.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ErrorInfo.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ErrorInfo', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'code') + ..aOS(2, _omitFieldNames ? '' : 'message') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ErrorInfo clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ErrorInfo copyWith(void Function(ErrorInfo) updates) => + super.copyWith((message) => updates(message as ErrorInfo)) as ErrorInfo; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ErrorInfo create() => ErrorInfo._(); + @$core.override + ErrorInfo createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ErrorInfo getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static ErrorInfo? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get code => $_getSZ(0); + @$pb.TagNumber(1) + set code($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasCode() => $_has(0); + @$pb.TagNumber(1) + void clearCode() => $_clearField(1); + + @$pb.TagNumber(2) + $core.String get message => $_getSZ(1); + @$pb.TagNumber(2) + set message($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasMessage() => $_has(1); + @$pb.TagNumber(2) + void clearMessage() => $_clearField(2); +} + +class HelloRequest extends $pb.GeneratedMessage { + factory HelloRequest({ + $core.String? clientName, + $core.String? clientVersion, + $core.String? altProtocolVersion, + }) { + final result = create(); + if (clientName != null) result.clientName = clientName; + if (clientVersion != null) result.clientVersion = clientVersion; + if (altProtocolVersion != null) + result.altProtocolVersion = altProtocolVersion; + return result; + } + + HelloRequest._(); + + factory HelloRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory HelloRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'HelloRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'clientName') + ..aOS(2, _omitFieldNames ? '' : 'clientVersion') + ..aOS(3, _omitFieldNames ? '' : 'altProtocolVersion') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HelloRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HelloRequest copyWith(void Function(HelloRequest) updates) => + super.copyWith((message) => updates(message as HelloRequest)) + as HelloRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static HelloRequest create() => HelloRequest._(); + @$core.override + HelloRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static HelloRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static HelloRequest? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get clientName => $_getSZ(0); + @$pb.TagNumber(1) + set clientName($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasClientName() => $_has(0); + @$pb.TagNumber(1) + void clearClientName() => $_clearField(1); + + @$pb.TagNumber(2) + $core.String get clientVersion => $_getSZ(1); + @$pb.TagNumber(2) + set clientVersion($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasClientVersion() => $_has(1); + @$pb.TagNumber(2) + void clearClientVersion() => $_clearField(2); + + @$pb.TagNumber(3) + $core.String get altProtocolVersion => $_getSZ(2); + @$pb.TagNumber(3) + set altProtocolVersion($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasAltProtocolVersion() => $_has(2); + @$pb.TagNumber(3) + void clearAltProtocolVersion() => $_clearField(3); +} + +class HelloResponse extends $pb.GeneratedMessage { + factory HelloResponse({ + $core.String? serverName, + $core.String? serverVersion, + $core.String? altProtocolVersion, + $core.Iterable<$core.String>? capabilities, + }) { + final result = create(); + if (serverName != null) result.serverName = serverName; + if (serverVersion != null) result.serverVersion = serverVersion; + if (altProtocolVersion != null) + result.altProtocolVersion = altProtocolVersion; + if (capabilities != null) result.capabilities.addAll(capabilities); + return result; + } + + HelloResponse._(); + + factory HelloResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory HelloResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'HelloResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'serverName') + ..aOS(2, _omitFieldNames ? '' : 'serverVersion') + ..aOS(3, _omitFieldNames ? '' : 'altProtocolVersion') + ..pPS(4, _omitFieldNames ? '' : 'capabilities') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HelloResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HelloResponse copyWith(void Function(HelloResponse) updates) => + super.copyWith((message) => updates(message as HelloResponse)) + as HelloResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static HelloResponse create() => HelloResponse._(); + @$core.override + HelloResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static HelloResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static HelloResponse? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get serverName => $_getSZ(0); + @$pb.TagNumber(1) + set serverName($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasServerName() => $_has(0); + @$pb.TagNumber(1) + void clearServerName() => $_clearField(1); + + @$pb.TagNumber(2) + $core.String get serverVersion => $_getSZ(1); + @$pb.TagNumber(2) + set serverVersion($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasServerVersion() => $_has(1); + @$pb.TagNumber(2) + void clearServerVersion() => $_clearField(2); + + @$pb.TagNumber(3) + $core.String get altProtocolVersion => $_getSZ(2); + @$pb.TagNumber(3) + set altProtocolVersion($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasAltProtocolVersion() => $_has(2); + @$pb.TagNumber(3) + void clearAltProtocolVersion() => $_clearField(3); + + @$pb.TagNumber(4) + $pb.PbList<$core.String> get capabilities => $_getList(3); +} + +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/apps/client/lib/src/generated/alt/v1/common.pbenum.dart b/apps/client/lib/src/generated/alt/v1/common.pbenum.dart new file mode 100644 index 0000000..f127d13 --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/common.pbenum.dart @@ -0,0 +1,111 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/common.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports + +import 'dart:core' as $core; + +import 'package:protobuf/protobuf.dart' as $pb; + +class Market extends $pb.ProtobufEnum { + static const Market MARKET_UNSPECIFIED = + Market._(0, _omitEnumNames ? '' : 'MARKET_UNSPECIFIED'); + static const Market MARKET_KR = + Market._(1, _omitEnumNames ? '' : 'MARKET_KR'); + static const Market MARKET_US = + Market._(2, _omitEnumNames ? '' : 'MARKET_US'); + + static const $core.List values = [ + MARKET_UNSPECIFIED, + MARKET_KR, + MARKET_US, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 2); + static Market? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Market._(super.value, super.name); +} + +class Venue extends $pb.ProtobufEnum { + static const Venue VENUE_UNSPECIFIED = + Venue._(0, _omitEnumNames ? '' : 'VENUE_UNSPECIFIED'); + static const Venue VENUE_KRX = Venue._(1, _omitEnumNames ? '' : 'VENUE_KRX'); + static const Venue VENUE_NASDAQ = + Venue._(2, _omitEnumNames ? '' : 'VENUE_NASDAQ'); + static const Venue VENUE_NYSE = + Venue._(3, _omitEnumNames ? '' : 'VENUE_NYSE'); + + static const $core.List values = [ + VENUE_UNSPECIFIED, + VENUE_KRX, + VENUE_NASDAQ, + VENUE_NYSE, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 3); + static Venue? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Venue._(super.value, super.name); +} + +class Currency extends $pb.ProtobufEnum { + static const Currency CURRENCY_UNSPECIFIED = + Currency._(0, _omitEnumNames ? '' : 'CURRENCY_UNSPECIFIED'); + static const Currency CURRENCY_KRW = + Currency._(1, _omitEnumNames ? '' : 'CURRENCY_KRW'); + static const Currency CURRENCY_USD = + Currency._(2, _omitEnumNames ? '' : 'CURRENCY_USD'); + + static const $core.List values = [ + CURRENCY_UNSPECIFIED, + CURRENCY_KRW, + CURRENCY_USD, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 2); + static Currency? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Currency._(super.value, super.name); +} + +class Timeframe extends $pb.ProtobufEnum { + static const Timeframe TIMEFRAME_UNSPECIFIED = + Timeframe._(0, _omitEnumNames ? '' : 'TIMEFRAME_UNSPECIFIED'); + static const Timeframe TIMEFRAME_DAILY = + Timeframe._(1, _omitEnumNames ? '' : 'TIMEFRAME_DAILY'); + static const Timeframe TIMEFRAME_MINUTE_1 = + Timeframe._(2, _omitEnumNames ? '' : 'TIMEFRAME_MINUTE_1'); + static const Timeframe TIMEFRAME_MINUTE_5 = + Timeframe._(3, _omitEnumNames ? '' : 'TIMEFRAME_MINUTE_5'); + + static const $core.List values = [ + TIMEFRAME_UNSPECIFIED, + TIMEFRAME_DAILY, + TIMEFRAME_MINUTE_1, + TIMEFRAME_MINUTE_5, + ]; + + static final $core.List _byValue = + $pb.ProtobufEnum.$_initByValueList(values, 3); + static Timeframe? valueOf($core.int value) => + value < 0 || value >= _byValue.length ? null : _byValue[value]; + + const Timeframe._(super.value, super.name); +} + +const $core.bool _omitEnumNames = + $core.bool.fromEnvironment('protobuf.omit_enum_names'); diff --git a/apps/client/lib/src/generated/alt/v1/common.pbjson.dart b/apps/client/lib/src/generated/alt/v1/common.pbjson.dart new file mode 100644 index 0000000..598dcf3 --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/common.pbjson.dart @@ -0,0 +1,150 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/common.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports +// ignore_for_file: unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use marketDescriptor instead') +const Market$json = { + '1': 'Market', + '2': [ + {'1': 'MARKET_UNSPECIFIED', '2': 0}, + {'1': 'MARKET_KR', '2': 1}, + {'1': 'MARKET_US', '2': 2}, + ], +}; + +/// Descriptor for `Market`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List marketDescriptor = $convert.base64Decode( + 'CgZNYXJrZXQSFgoSTUFSS0VUX1VOU1BFQ0lGSUVEEAASDQoJTUFSS0VUX0tSEAESDQoJTUFSS0' + 'VUX1VTEAI='); + +@$core.Deprecated('Use venueDescriptor instead') +const Venue$json = { + '1': 'Venue', + '2': [ + {'1': 'VENUE_UNSPECIFIED', '2': 0}, + {'1': 'VENUE_KRX', '2': 1}, + {'1': 'VENUE_NASDAQ', '2': 2}, + {'1': 'VENUE_NYSE', '2': 3}, + ], +}; + +/// Descriptor for `Venue`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List venueDescriptor = $convert.base64Decode( + 'CgVWZW51ZRIVChFWRU5VRV9VTlNQRUNJRklFRBAAEg0KCVZFTlVFX0tSWBABEhAKDFZFTlVFX0' + '5BU0RBURACEg4KClZFTlVFX05ZU0UQAw=='); + +@$core.Deprecated('Use currencyDescriptor instead') +const Currency$json = { + '1': 'Currency', + '2': [ + {'1': 'CURRENCY_UNSPECIFIED', '2': 0}, + {'1': 'CURRENCY_KRW', '2': 1}, + {'1': 'CURRENCY_USD', '2': 2}, + ], +}; + +/// Descriptor for `Currency`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List currencyDescriptor = $convert.base64Decode( + 'CghDdXJyZW5jeRIYChRDVVJSRU5DWV9VTlNQRUNJRklFRBAAEhAKDENVUlJFTkNZX0tSVxABEh' + 'AKDENVUlJFTkNZX1VTRBAC'); + +@$core.Deprecated('Use timeframeDescriptor instead') +const Timeframe$json = { + '1': 'Timeframe', + '2': [ + {'1': 'TIMEFRAME_UNSPECIFIED', '2': 0}, + {'1': 'TIMEFRAME_DAILY', '2': 1}, + {'1': 'TIMEFRAME_MINUTE_1', '2': 2}, + {'1': 'TIMEFRAME_MINUTE_5', '2': 3}, + ], +}; + +/// Descriptor for `Timeframe`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List timeframeDescriptor = $convert.base64Decode( + 'CglUaW1lZnJhbWUSGQoVVElNRUZSQU1FX1VOU1BFQ0lGSUVEEAASEwoPVElNRUZSQU1FX0RBSU' + 'xZEAESFgoSVElNRUZSQU1FX01JTlVURV8xEAISFgoSVElNRUZSQU1FX01JTlVURV81EAM='); + +@$core.Deprecated('Use decimalDescriptor instead') +const Decimal$json = { + '1': 'Decimal', + '2': [ + {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'}, + ], +}; + +/// Descriptor for `Decimal`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List decimalDescriptor = + $convert.base64Decode('CgdEZWNpbWFsEhQKBXZhbHVlGAEgASgJUgV2YWx1ZQ=='); + +@$core.Deprecated('Use errorInfoDescriptor instead') +const ErrorInfo$json = { + '1': 'ErrorInfo', + '2': [ + {'1': 'code', '3': 1, '4': 1, '5': 9, '10': 'code'}, + {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'}, + ], +}; + +/// Descriptor for `ErrorInfo`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List errorInfoDescriptor = $convert.base64Decode( + 'CglFcnJvckluZm8SEgoEY29kZRgBIAEoCVIEY29kZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYW' + 'dl'); + +@$core.Deprecated('Use helloRequestDescriptor instead') +const HelloRequest$json = { + '1': 'HelloRequest', + '2': [ + {'1': 'client_name', '3': 1, '4': 1, '5': 9, '10': 'clientName'}, + {'1': 'client_version', '3': 2, '4': 1, '5': 9, '10': 'clientVersion'}, + { + '1': 'alt_protocol_version', + '3': 3, + '4': 1, + '5': 9, + '10': 'altProtocolVersion' + }, + ], +}; + +/// Descriptor for `HelloRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List helloRequestDescriptor = $convert.base64Decode( + 'CgxIZWxsb1JlcXVlc3QSHwoLY2xpZW50X25hbWUYASABKAlSCmNsaWVudE5hbWUSJQoOY2xpZW' + '50X3ZlcnNpb24YAiABKAlSDWNsaWVudFZlcnNpb24SMAoUYWx0X3Byb3RvY29sX3ZlcnNpb24Y' + 'AyABKAlSEmFsdFByb3RvY29sVmVyc2lvbg=='); + +@$core.Deprecated('Use helloResponseDescriptor instead') +const HelloResponse$json = { + '1': 'HelloResponse', + '2': [ + {'1': 'server_name', '3': 1, '4': 1, '5': 9, '10': 'serverName'}, + {'1': 'server_version', '3': 2, '4': 1, '5': 9, '10': 'serverVersion'}, + { + '1': 'alt_protocol_version', + '3': 3, + '4': 1, + '5': 9, + '10': 'altProtocolVersion' + }, + {'1': 'capabilities', '3': 4, '4': 3, '5': 9, '10': 'capabilities'}, + ], +}; + +/// Descriptor for `HelloResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List helloResponseDescriptor = $convert.base64Decode( + 'Cg1IZWxsb1Jlc3BvbnNlEh8KC3NlcnZlcl9uYW1lGAEgASgJUgpzZXJ2ZXJOYW1lEiUKDnNlcn' + 'Zlcl92ZXJzaW9uGAIgASgJUg1zZXJ2ZXJWZXJzaW9uEjAKFGFsdF9wcm90b2NvbF92ZXJzaW9u' + 'GAMgASgJUhJhbHRQcm90b2NvbFZlcnNpb24SIgoMY2FwYWJpbGl0aWVzGAQgAygJUgxjYXBhYm' + 'lsaXRpZXM='); diff --git a/apps/client/lib/src/generated/alt/v1/market.pb.dart b/apps/client/lib/src/generated/alt/v1/market.pb.dart new file mode 100644 index 0000000..1b1adbd --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/market.pb.dart @@ -0,0 +1,683 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/market.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +import 'common.pb.dart' as $0; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +class Instrument extends $pb.GeneratedMessage { + factory Instrument({ + $core.String? id, + $0.Market? market, + $0.Venue? venue, + $core.String? symbol, + $core.String? name, + $0.Currency? currency, + $core.Iterable<$core.MapEntry<$core.String, $core.String>>? providerSymbols, + }) { + final result = create(); + if (id != null) result.id = id; + if (market != null) result.market = market; + if (venue != null) result.venue = venue; + if (symbol != null) result.symbol = symbol; + if (name != null) result.name = name; + if (currency != null) result.currency = currency; + if (providerSymbols != null) + result.providerSymbols.addEntries(providerSymbols); + return result; + } + + Instrument._(); + + factory Instrument.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Instrument.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Instrument', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'id') + ..aE<$0.Market>(2, _omitFieldNames ? '' : 'market', + enumValues: $0.Market.values) + ..aE<$0.Venue>(3, _omitFieldNames ? '' : 'venue', + enumValues: $0.Venue.values) + ..aOS(4, _omitFieldNames ? '' : 'symbol') + ..aOS(5, _omitFieldNames ? '' : 'name') + ..aE<$0.Currency>(6, _omitFieldNames ? '' : 'currency', + enumValues: $0.Currency.values) + ..m<$core.String, $core.String>(7, _omitFieldNames ? '' : 'providerSymbols', + entryClassName: 'Instrument.ProviderSymbolsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OS, + packageName: const $pb.PackageName('alt.v1')) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Instrument clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Instrument copyWith(void Function(Instrument) updates) => + super.copyWith((message) => updates(message as Instrument)) as Instrument; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Instrument create() => Instrument._(); + @$core.override + Instrument createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static Instrument getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static Instrument? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => $_clearField(1); + + @$pb.TagNumber(2) + $0.Market get market => $_getN(1); + @$pb.TagNumber(2) + set market($0.Market value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasMarket() => $_has(1); + @$pb.TagNumber(2) + void clearMarket() => $_clearField(2); + + @$pb.TagNumber(3) + $0.Venue get venue => $_getN(2); + @$pb.TagNumber(3) + set venue($0.Venue value) => $_setField(3, value); + @$pb.TagNumber(3) + $core.bool hasVenue() => $_has(2); + @$pb.TagNumber(3) + void clearVenue() => $_clearField(3); + + @$pb.TagNumber(4) + $core.String get symbol => $_getSZ(3); + @$pb.TagNumber(4) + set symbol($core.String value) => $_setString(3, value); + @$pb.TagNumber(4) + $core.bool hasSymbol() => $_has(3); + @$pb.TagNumber(4) + void clearSymbol() => $_clearField(4); + + @$pb.TagNumber(5) + $core.String get name => $_getSZ(4); + @$pb.TagNumber(5) + set name($core.String value) => $_setString(4, value); + @$pb.TagNumber(5) + $core.bool hasName() => $_has(4); + @$pb.TagNumber(5) + void clearName() => $_clearField(5); + + @$pb.TagNumber(6) + $0.Currency get currency => $_getN(5); + @$pb.TagNumber(6) + set currency($0.Currency value) => $_setField(6, value); + @$pb.TagNumber(6) + $core.bool hasCurrency() => $_has(5); + @$pb.TagNumber(6) + void clearCurrency() => $_clearField(6); + + @$pb.TagNumber(7) + $pb.PbMap<$core.String, $core.String> get providerSymbols => $_getMap(6); +} + +class Price extends $pb.GeneratedMessage { + factory Price({ + $0.Currency? currency, + $0.Decimal? amount, + }) { + final result = create(); + if (currency != null) result.currency = currency; + if (amount != null) result.amount = amount; + return result; + } + + Price._(); + + factory Price.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Price.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Price', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aE<$0.Currency>(1, _omitFieldNames ? '' : 'currency', + enumValues: $0.Currency.values) + ..aOM<$0.Decimal>(2, _omitFieldNames ? '' : 'amount', + subBuilder: $0.Decimal.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Price clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Price copyWith(void Function(Price) updates) => + super.copyWith((message) => updates(message as Price)) as Price; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Price create() => Price._(); + @$core.override + Price createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static Price getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Price? _defaultInstance; + + @$pb.TagNumber(1) + $0.Currency get currency => $_getN(0); + @$pb.TagNumber(1) + set currency($0.Currency value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasCurrency() => $_has(0); + @$pb.TagNumber(1) + void clearCurrency() => $_clearField(1); + + @$pb.TagNumber(2) + $0.Decimal get amount => $_getN(1); + @$pb.TagNumber(2) + set amount($0.Decimal value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasAmount() => $_has(1); + @$pb.TagNumber(2) + void clearAmount() => $_clearField(2); + @$pb.TagNumber(2) + $0.Decimal ensureAmount() => $_ensure(1); +} + +class Quantity extends $pb.GeneratedMessage { + factory Quantity({ + $0.Decimal? amount, + }) { + final result = create(); + if (amount != null) result.amount = amount; + return result; + } + + Quantity._(); + + factory Quantity.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Quantity.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Quantity', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOM<$0.Decimal>(1, _omitFieldNames ? '' : 'amount', + subBuilder: $0.Decimal.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Quantity clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Quantity copyWith(void Function(Quantity) updates) => + super.copyWith((message) => updates(message as Quantity)) as Quantity; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Quantity create() => Quantity._(); + @$core.override + Quantity createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static Quantity getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Quantity? _defaultInstance; + + @$pb.TagNumber(1) + $0.Decimal get amount => $_getN(0); + @$pb.TagNumber(1) + set amount($0.Decimal value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasAmount() => $_has(0); + @$pb.TagNumber(1) + void clearAmount() => $_clearField(1); + @$pb.TagNumber(1) + $0.Decimal ensureAmount() => $_ensure(0); +} + +class Bar extends $pb.GeneratedMessage { + factory Bar({ + $core.String? instrumentId, + $0.Timeframe? timeframe, + $fixnum.Int64? timestampUnixMs, + Price? open, + Price? high, + Price? low, + Price? close, + Quantity? volume, + }) { + final result = create(); + if (instrumentId != null) result.instrumentId = instrumentId; + if (timeframe != null) result.timeframe = timeframe; + if (timestampUnixMs != null) result.timestampUnixMs = timestampUnixMs; + if (open != null) result.open = open; + if (high != null) result.high = high; + if (low != null) result.low = low; + if (close != null) result.close = close; + if (volume != null) result.volume = volume; + return result; + } + + Bar._(); + + factory Bar.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Bar.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Bar', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'instrumentId') + ..aE<$0.Timeframe>(2, _omitFieldNames ? '' : 'timeframe', + enumValues: $0.Timeframe.values) + ..aInt64(3, _omitFieldNames ? '' : 'timestampUnixMs') + ..aOM(4, _omitFieldNames ? '' : 'open', subBuilder: Price.create) + ..aOM(5, _omitFieldNames ? '' : 'high', subBuilder: Price.create) + ..aOM(6, _omitFieldNames ? '' : 'low', subBuilder: Price.create) + ..aOM(7, _omitFieldNames ? '' : 'close', subBuilder: Price.create) + ..aOM(8, _omitFieldNames ? '' : 'volume', + subBuilder: Quantity.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Bar clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Bar copyWith(void Function(Bar) updates) => + super.copyWith((message) => updates(message as Bar)) as Bar; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Bar create() => Bar._(); + @$core.override + Bar createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static Bar getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Bar? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get instrumentId => $_getSZ(0); + @$pb.TagNumber(1) + set instrumentId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasInstrumentId() => $_has(0); + @$pb.TagNumber(1) + void clearInstrumentId() => $_clearField(1); + + @$pb.TagNumber(2) + $0.Timeframe get timeframe => $_getN(1); + @$pb.TagNumber(2) + set timeframe($0.Timeframe value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasTimeframe() => $_has(1); + @$pb.TagNumber(2) + void clearTimeframe() => $_clearField(2); + + @$pb.TagNumber(3) + $fixnum.Int64 get timestampUnixMs => $_getI64(2); + @$pb.TagNumber(3) + set timestampUnixMs($fixnum.Int64 value) => $_setInt64(2, value); + @$pb.TagNumber(3) + $core.bool hasTimestampUnixMs() => $_has(2); + @$pb.TagNumber(3) + void clearTimestampUnixMs() => $_clearField(3); + + @$pb.TagNumber(4) + Price get open => $_getN(3); + @$pb.TagNumber(4) + set open(Price value) => $_setField(4, value); + @$pb.TagNumber(4) + $core.bool hasOpen() => $_has(3); + @$pb.TagNumber(4) + void clearOpen() => $_clearField(4); + @$pb.TagNumber(4) + Price ensureOpen() => $_ensure(3); + + @$pb.TagNumber(5) + Price get high => $_getN(4); + @$pb.TagNumber(5) + set high(Price value) => $_setField(5, value); + @$pb.TagNumber(5) + $core.bool hasHigh() => $_has(4); + @$pb.TagNumber(5) + void clearHigh() => $_clearField(5); + @$pb.TagNumber(5) + Price ensureHigh() => $_ensure(4); + + @$pb.TagNumber(6) + Price get low => $_getN(5); + @$pb.TagNumber(6) + set low(Price value) => $_setField(6, value); + @$pb.TagNumber(6) + $core.bool hasLow() => $_has(5); + @$pb.TagNumber(6) + void clearLow() => $_clearField(6); + @$pb.TagNumber(6) + Price ensureLow() => $_ensure(5); + + @$pb.TagNumber(7) + Price get close => $_getN(6); + @$pb.TagNumber(7) + set close(Price value) => $_setField(7, value); + @$pb.TagNumber(7) + $core.bool hasClose() => $_has(6); + @$pb.TagNumber(7) + void clearClose() => $_clearField(7); + @$pb.TagNumber(7) + Price ensureClose() => $_ensure(6); + + @$pb.TagNumber(8) + Quantity get volume => $_getN(7); + @$pb.TagNumber(8) + set volume(Quantity value) => $_setField(8, value); + @$pb.TagNumber(8) + $core.bool hasVolume() => $_has(7); + @$pb.TagNumber(8) + void clearVolume() => $_clearField(8); + @$pb.TagNumber(8) + Quantity ensureVolume() => $_ensure(7); +} + +class ListInstrumentsRequest extends $pb.GeneratedMessage { + factory ListInstrumentsRequest({ + $0.Market? market, + $core.String? provider, + }) { + final result = create(); + if (market != null) result.market = market; + if (provider != null) result.provider = provider; + return result; + } + + ListInstrumentsRequest._(); + + factory ListInstrumentsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListInstrumentsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListInstrumentsRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aE<$0.Market>(1, _omitFieldNames ? '' : 'market', + enumValues: $0.Market.values) + ..aOS(2, _omitFieldNames ? '' : 'provider') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListInstrumentsRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListInstrumentsRequest copyWith( + void Function(ListInstrumentsRequest) updates) => + super.copyWith((message) => updates(message as ListInstrumentsRequest)) + as ListInstrumentsRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListInstrumentsRequest create() => ListInstrumentsRequest._(); + @$core.override + ListInstrumentsRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ListInstrumentsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListInstrumentsRequest? _defaultInstance; + + @$pb.TagNumber(1) + $0.Market get market => $_getN(0); + @$pb.TagNumber(1) + set market($0.Market value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasMarket() => $_has(0); + @$pb.TagNumber(1) + void clearMarket() => $_clearField(1); + + @$pb.TagNumber(2) + $core.String get provider => $_getSZ(1); + @$pb.TagNumber(2) + set provider($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasProvider() => $_has(1); + @$pb.TagNumber(2) + void clearProvider() => $_clearField(2); +} + +class ListInstrumentsResponse extends $pb.GeneratedMessage { + factory ListInstrumentsResponse({ + $core.Iterable? instruments, + }) { + final result = create(); + if (instruments != null) result.instruments.addAll(instruments); + return result; + } + + ListInstrumentsResponse._(); + + factory ListInstrumentsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListInstrumentsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListInstrumentsResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'instruments', + subBuilder: Instrument.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListInstrumentsResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListInstrumentsResponse copyWith( + void Function(ListInstrumentsResponse) updates) => + super.copyWith((message) => updates(message as ListInstrumentsResponse)) + as ListInstrumentsResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListInstrumentsResponse create() => ListInstrumentsResponse._(); + @$core.override + ListInstrumentsResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ListInstrumentsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListInstrumentsResponse? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get instruments => $_getList(0); +} + +class ListBarsRequest extends $pb.GeneratedMessage { + factory ListBarsRequest({ + $core.String? instrumentId, + $0.Timeframe? timeframe, + $fixnum.Int64? fromUnixMs, + $fixnum.Int64? toUnixMs, + }) { + final result = create(); + if (instrumentId != null) result.instrumentId = instrumentId; + if (timeframe != null) result.timeframe = timeframe; + if (fromUnixMs != null) result.fromUnixMs = fromUnixMs; + if (toUnixMs != null) result.toUnixMs = toUnixMs; + return result; + } + + ListBarsRequest._(); + + factory ListBarsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListBarsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListBarsRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'instrumentId') + ..aE<$0.Timeframe>(2, _omitFieldNames ? '' : 'timeframe', + enumValues: $0.Timeframe.values) + ..aInt64(3, _omitFieldNames ? '' : 'fromUnixMs') + ..aInt64(4, _omitFieldNames ? '' : 'toUnixMs') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListBarsRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListBarsRequest copyWith(void Function(ListBarsRequest) updates) => + super.copyWith((message) => updates(message as ListBarsRequest)) + as ListBarsRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListBarsRequest create() => ListBarsRequest._(); + @$core.override + ListBarsRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ListBarsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListBarsRequest? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get instrumentId => $_getSZ(0); + @$pb.TagNumber(1) + set instrumentId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasInstrumentId() => $_has(0); + @$pb.TagNumber(1) + void clearInstrumentId() => $_clearField(1); + + @$pb.TagNumber(2) + $0.Timeframe get timeframe => $_getN(1); + @$pb.TagNumber(2) + set timeframe($0.Timeframe value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasTimeframe() => $_has(1); + @$pb.TagNumber(2) + void clearTimeframe() => $_clearField(2); + + @$pb.TagNumber(3) + $fixnum.Int64 get fromUnixMs => $_getI64(2); + @$pb.TagNumber(3) + set fromUnixMs($fixnum.Int64 value) => $_setInt64(2, value); + @$pb.TagNumber(3) + $core.bool hasFromUnixMs() => $_has(2); + @$pb.TagNumber(3) + void clearFromUnixMs() => $_clearField(3); + + @$pb.TagNumber(4) + $fixnum.Int64 get toUnixMs => $_getI64(3); + @$pb.TagNumber(4) + set toUnixMs($fixnum.Int64 value) => $_setInt64(3, value); + @$pb.TagNumber(4) + $core.bool hasToUnixMs() => $_has(3); + @$pb.TagNumber(4) + void clearToUnixMs() => $_clearField(4); +} + +class ListBarsResponse extends $pb.GeneratedMessage { + factory ListBarsResponse({ + $core.Iterable? bars, + }) { + final result = create(); + if (bars != null) result.bars.addAll(bars); + return result; + } + + ListBarsResponse._(); + + factory ListBarsResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ListBarsResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ListBarsResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'alt.v1'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'bars', subBuilder: Bar.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListBarsResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ListBarsResponse copyWith(void Function(ListBarsResponse) updates) => + super.copyWith((message) => updates(message as ListBarsResponse)) + as ListBarsResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ListBarsResponse create() => ListBarsResponse._(); + @$core.override + ListBarsResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ListBarsResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ListBarsResponse? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get bars => $_getList(0); +} + +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/apps/client/lib/src/generated/alt/v1/market.pbenum.dart b/apps/client/lib/src/generated/alt/v1/market.pbenum.dart new file mode 100644 index 0000000..4999008 --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/market.pbenum.dart @@ -0,0 +1,11 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/market.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports diff --git a/apps/client/lib/src/generated/alt/v1/market.pbjson.dart b/apps/client/lib/src/generated/alt/v1/market.pbjson.dart new file mode 100644 index 0000000..2e44296 --- /dev/null +++ b/apps/client/lib/src/generated/alt/v1/market.pbjson.dart @@ -0,0 +1,251 @@ +// This is a generated file - do not edit. +// +// Generated from alt/v1/market.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports +// ignore_for_file: unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use instrumentDescriptor instead') +const Instrument$json = { + '1': 'Instrument', + '2': [ + {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + { + '1': 'market', + '3': 2, + '4': 1, + '5': 14, + '6': '.alt.v1.Market', + '10': 'market' + }, + { + '1': 'venue', + '3': 3, + '4': 1, + '5': 14, + '6': '.alt.v1.Venue', + '10': 'venue' + }, + {'1': 'symbol', '3': 4, '4': 1, '5': 9, '10': 'symbol'}, + {'1': 'name', '3': 5, '4': 1, '5': 9, '10': 'name'}, + { + '1': 'currency', + '3': 6, + '4': 1, + '5': 14, + '6': '.alt.v1.Currency', + '10': 'currency' + }, + { + '1': 'provider_symbols', + '3': 7, + '4': 3, + '5': 11, + '6': '.alt.v1.Instrument.ProviderSymbolsEntry', + '10': 'providerSymbols' + }, + ], + '3': [Instrument_ProviderSymbolsEntry$json], +}; + +@$core.Deprecated('Use instrumentDescriptor instead') +const Instrument_ProviderSymbolsEntry$json = { + '1': 'ProviderSymbolsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'}, + ], + '7': {'7': true}, +}; + +/// Descriptor for `Instrument`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List instrumentDescriptor = $convert.base64Decode( + 'CgpJbnN0cnVtZW50Eg4KAmlkGAEgASgJUgJpZBImCgZtYXJrZXQYAiABKA4yDi5hbHQudjEuTW' + 'Fya2V0UgZtYXJrZXQSIwoFdmVudWUYAyABKA4yDS5hbHQudjEuVmVudWVSBXZlbnVlEhYKBnN5' + 'bWJvbBgEIAEoCVIGc3ltYm9sEhIKBG5hbWUYBSABKAlSBG5hbWUSLAoIY3VycmVuY3kYBiABKA' + '4yEC5hbHQudjEuQ3VycmVuY3lSCGN1cnJlbmN5ElIKEHByb3ZpZGVyX3N5bWJvbHMYByADKAsy' + 'Jy5hbHQudjEuSW5zdHJ1bWVudC5Qcm92aWRlclN5bWJvbHNFbnRyeVIPcHJvdmlkZXJTeW1ib2' + 'xzGkIKFFByb3ZpZGVyU3ltYm9sc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIg' + 'ASgJUgV2YWx1ZToCOAE='); + +@$core.Deprecated('Use priceDescriptor instead') +const Price$json = { + '1': 'Price', + '2': [ + { + '1': 'currency', + '3': 1, + '4': 1, + '5': 14, + '6': '.alt.v1.Currency', + '10': 'currency' + }, + { + '1': 'amount', + '3': 2, + '4': 1, + '5': 11, + '6': '.alt.v1.Decimal', + '10': 'amount' + }, + ], +}; + +/// Descriptor for `Price`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List priceDescriptor = $convert.base64Decode( + 'CgVQcmljZRIsCghjdXJyZW5jeRgBIAEoDjIQLmFsdC52MS5DdXJyZW5jeVIIY3VycmVuY3kSJw' + 'oGYW1vdW50GAIgASgLMg8uYWx0LnYxLkRlY2ltYWxSBmFtb3VudA=='); + +@$core.Deprecated('Use quantityDescriptor instead') +const Quantity$json = { + '1': 'Quantity', + '2': [ + { + '1': 'amount', + '3': 1, + '4': 1, + '5': 11, + '6': '.alt.v1.Decimal', + '10': 'amount' + }, + ], +}; + +/// Descriptor for `Quantity`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List quantityDescriptor = $convert.base64Decode( + 'CghRdWFudGl0eRInCgZhbW91bnQYASABKAsyDy5hbHQudjEuRGVjaW1hbFIGYW1vdW50'); + +@$core.Deprecated('Use barDescriptor instead') +const Bar$json = { + '1': 'Bar', + '2': [ + {'1': 'instrument_id', '3': 1, '4': 1, '5': 9, '10': 'instrumentId'}, + { + '1': 'timeframe', + '3': 2, + '4': 1, + '5': 14, + '6': '.alt.v1.Timeframe', + '10': 'timeframe' + }, + {'1': 'timestamp_unix_ms', '3': 3, '4': 1, '5': 3, '10': 'timestampUnixMs'}, + {'1': 'open', '3': 4, '4': 1, '5': 11, '6': '.alt.v1.Price', '10': 'open'}, + {'1': 'high', '3': 5, '4': 1, '5': 11, '6': '.alt.v1.Price', '10': 'high'}, + {'1': 'low', '3': 6, '4': 1, '5': 11, '6': '.alt.v1.Price', '10': 'low'}, + { + '1': 'close', + '3': 7, + '4': 1, + '5': 11, + '6': '.alt.v1.Price', + '10': 'close' + }, + { + '1': 'volume', + '3': 8, + '4': 1, + '5': 11, + '6': '.alt.v1.Quantity', + '10': 'volume' + }, + ], +}; + +/// Descriptor for `Bar`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List barDescriptor = $convert.base64Decode( + 'CgNCYXISIwoNaW5zdHJ1bWVudF9pZBgBIAEoCVIMaW5zdHJ1bWVudElkEi8KCXRpbWVmcmFtZR' + 'gCIAEoDjIRLmFsdC52MS5UaW1lZnJhbWVSCXRpbWVmcmFtZRIqChF0aW1lc3RhbXBfdW5peF9t' + 'cxgDIAEoA1IPdGltZXN0YW1wVW5peE1zEiEKBG9wZW4YBCABKAsyDS5hbHQudjEuUHJpY2VSBG' + '9wZW4SIQoEaGlnaBgFIAEoCzINLmFsdC52MS5QcmljZVIEaGlnaBIfCgNsb3cYBiABKAsyDS5h' + 'bHQudjEuUHJpY2VSA2xvdxIjCgVjbG9zZRgHIAEoCzINLmFsdC52MS5QcmljZVIFY2xvc2USKA' + 'oGdm9sdW1lGAggASgLMhAuYWx0LnYxLlF1YW50aXR5UgZ2b2x1bWU='); + +@$core.Deprecated('Use listInstrumentsRequestDescriptor instead') +const ListInstrumentsRequest$json = { + '1': 'ListInstrumentsRequest', + '2': [ + { + '1': 'market', + '3': 1, + '4': 1, + '5': 14, + '6': '.alt.v1.Market', + '10': 'market' + }, + {'1': 'provider', '3': 2, '4': 1, '5': 9, '10': 'provider'}, + ], +}; + +/// Descriptor for `ListInstrumentsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listInstrumentsRequestDescriptor = + $convert.base64Decode( + 'ChZMaXN0SW5zdHJ1bWVudHNSZXF1ZXN0EiYKBm1hcmtldBgBIAEoDjIOLmFsdC52MS5NYXJrZX' + 'RSBm1hcmtldBIaCghwcm92aWRlchgCIAEoCVIIcHJvdmlkZXI='); + +@$core.Deprecated('Use listInstrumentsResponseDescriptor instead') +const ListInstrumentsResponse$json = { + '1': 'ListInstrumentsResponse', + '2': [ + { + '1': 'instruments', + '3': 1, + '4': 3, + '5': 11, + '6': '.alt.v1.Instrument', + '10': 'instruments' + }, + ], +}; + +/// Descriptor for `ListInstrumentsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listInstrumentsResponseDescriptor = + $convert.base64Decode( + 'ChdMaXN0SW5zdHJ1bWVudHNSZXNwb25zZRI0CgtpbnN0cnVtZW50cxgBIAMoCzISLmFsdC52MS' + '5JbnN0cnVtZW50UgtpbnN0cnVtZW50cw=='); + +@$core.Deprecated('Use listBarsRequestDescriptor instead') +const ListBarsRequest$json = { + '1': 'ListBarsRequest', + '2': [ + {'1': 'instrument_id', '3': 1, '4': 1, '5': 9, '10': 'instrumentId'}, + { + '1': 'timeframe', + '3': 2, + '4': 1, + '5': 14, + '6': '.alt.v1.Timeframe', + '10': 'timeframe' + }, + {'1': 'from_unix_ms', '3': 3, '4': 1, '5': 3, '10': 'fromUnixMs'}, + {'1': 'to_unix_ms', '3': 4, '4': 1, '5': 3, '10': 'toUnixMs'}, + ], +}; + +/// Descriptor for `ListBarsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listBarsRequestDescriptor = $convert.base64Decode( + 'Cg9MaXN0QmFyc1JlcXVlc3QSIwoNaW5zdHJ1bWVudF9pZBgBIAEoCVIMaW5zdHJ1bWVudElkEi' + '8KCXRpbWVmcmFtZRgCIAEoDjIRLmFsdC52MS5UaW1lZnJhbWVSCXRpbWVmcmFtZRIgCgxmcm9t' + 'X3VuaXhfbXMYAyABKANSCmZyb21Vbml4TXMSHAoKdG9fdW5peF9tcxgEIAEoA1IIdG9Vbml4TX' + 'M='); + +@$core.Deprecated('Use listBarsResponseDescriptor instead') +const ListBarsResponse$json = { + '1': 'ListBarsResponse', + '2': [ + {'1': 'bars', '3': 1, '4': 3, '5': 11, '6': '.alt.v1.Bar', '10': 'bars'}, + ], +}; + +/// Descriptor for `ListBarsResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List listBarsResponseDescriptor = $convert.base64Decode( + 'ChBMaXN0QmFyc1Jlc3BvbnNlEh8KBGJhcnMYASADKAsyCy5hbHQudjEuQmFyUgRiYXJz'); diff --git a/apps/client/pubspec.lock b/apps/client/pubspec.lock index feda609..9f15c5c 100644 --- a/apps/client/pubspec.lock +++ b/apps/client/pubspec.lock @@ -105,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.9" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" + url: "https://pub.dev" + source: hosted + version: "3.1.7" fake_async: dependency: transitive description: @@ -122,7 +130,7 @@ packages: source: hosted version: "7.0.1" fixnum: - dependency: transitive + dependency: "direct main" description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be @@ -320,6 +328,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.0" + protoc_plugin: + dependency: "direct dev" + description: + name: protoc_plugin + sha256: d1ea363e9118f954d9d482c2f7281c5ff5149b059e68672d1faa564d49091f05 + url: "https://pub.dev" + source: hosted + version: "25.0.0" pub_semver: dependency: transitive description: diff --git a/apps/client/pubspec.yaml b/apps/client/pubspec.yaml index ae8c03e..53a1d07 100644 --- a/apps/client/pubspec.yaml +++ b/apps/client/pubspec.yaml @@ -37,6 +37,7 @@ dependencies: flutter_riverpod: ^3.3.1 go_router: ^17.2.3 protobuf: ^6.0.0 + fixnum: ^1.1.1 dev_dependencies: flutter_test: @@ -48,6 +49,7 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^6.0.0 + protoc_plugin: ^25.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/apps/client/tool/protoc-gen-dart b/apps/client/tool/protoc-gen-dart new file mode 100755 index 0000000..5a89270 --- /dev/null +++ b/apps/client/tool/protoc-gen-dart @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -euo pipefail + +client_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$client_root" +exec dart run protoc_plugin "$@" diff --git a/bin/contracts-check b/bin/contracts-check new file mode 100755 index 0000000..a04192e --- /dev/null +++ b/bin/contracts-check @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +go_out="$root/packages/contracts/gen/go" +dart_out="$root/apps/client/lib/src/generated" + +snapshot_dir="$(mktemp -d)" +trap 'rm -rf "$snapshot_dir"' EXIT + +snapshot_go="$snapshot_dir/go" +snapshot_dart="$snapshot_dir/dart" +mkdir -p "$snapshot_go" "$snapshot_dart" + +if [ -d "$go_out" ]; then + cp -R "$go_out/." "$snapshot_go/" +fi +if [ -d "$dart_out" ]; then + cp -R "$dart_out/." "$snapshot_dart/" +fi + +"$root/bin/contracts-gen" + +drift=0 + +if ! diff -ru "$snapshot_go" "$go_out" >/dev/null; then + echo "contracts-check: Go generated output drift detected under $go_out" >&2 + diff -ru "$snapshot_go" "$go_out" >&2 || true + drift=1 +fi + +if ! diff -ru "$snapshot_dart" "$dart_out" >/dev/null; then + echo "contracts-check: Dart generated output drift detected under $dart_out" >&2 + diff -ru "$snapshot_dart" "$dart_out" >&2 || true + drift=1 +fi + +if [ "$drift" -ne 0 ]; then + echo "contracts-check: run bin/contracts-gen and commit the regenerated output" >&2 + exit 1 +fi diff --git a/bin/contracts-gen b/bin/contracts-gen new file mode 100755 index 0000000..e10c29e --- /dev/null +++ b/bin/contracts-gen @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +proto_root="$root/packages/contracts/proto" +go_out="$root/packages/contracts/gen/go" +dart_out="$root/apps/client/lib/src/generated" +dart_plugin="$root/apps/client/tool/protoc-gen-dart" + +require_cmd() { + if ! command -v "$1" >/dev/null 2>&1; then + echo "contracts-gen: required command not found: $1" >&2 + exit 1 + fi +} + +require_cmd protoc +require_cmd protoc-gen-go + +if [ ! -x "$dart_plugin" ]; then + echo "contracts-gen: dart protoc plugin wrapper missing or not executable: $dart_plugin" >&2 + exit 1 +fi + +protos=( + "alt/v1/common.proto" + "alt/v1/market.proto" + "alt/v1/backtest.proto" +) + +mkdir -p "$go_out" +mkdir -p "$dart_out" + +( + cd "$proto_root" + protoc \ + -I . \ + --go_out="$go_out" \ + --go_opt=paths=source_relative \ + "${protos[@]}" +) + +( + cd "$proto_root" + protoc \ + -I . \ + --plugin=protoc-gen-dart="$dart_plugin" \ + --dart_out="$dart_out" \ + "${protos[@]}" +) diff --git a/bin/lint b/bin/lint index c2bece6..c4291f4 100755 --- a/bin/lint +++ b/bin/lint @@ -4,6 +4,7 @@ set -euo pipefail root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" for module in \ + "$root/packages/contracts/gen/go" \ "$root/packages/domain" \ "$root/services/api" \ "$root/services/worker" \ diff --git a/bin/test b/bin/test index 79a3d8c..64800a6 100755 --- a/bin/test +++ b/bin/test @@ -3,7 +3,10 @@ set -euo pipefail root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +"$root/bin/contracts-check" + for module in \ + "$root/packages/contracts/gen/go" \ "$root/packages/domain" \ "$root/services/api" \ "$root/services/worker" \ diff --git a/go.work b/go.work index 38315de..ebb056d 100644 --- a/go.work +++ b/go.work @@ -3,6 +3,7 @@ go 1.22 use ( ../proto-socket/go ./apps/cli + ./packages/contracts/gen/go ./packages/domain ./services/api ./services/worker diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 0000000..2c32801 --- /dev/null +++ b/go.work.sum @@ -0,0 +1 @@ +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 8ed87c9..25f9bc1 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -8,5 +8,31 @@ Initial contract direction: - additive protobuf changes first - explicit handshake/version messages because proto-socket protocol `0.1` does not carry an application version field -- market-neutral models with Korea market daily bars as the MVP path +- market-neutral models with Korea market daily bars as the MVP path (including `ListBarsRequest`/`ListBarsResponse` and `GetBacktestResultRequest`/`GetBacktestResultResponse` for the MVP schema) - generated clients should be derived from `proto/` sources, not edited by hand + +## Compatibility + +- Prefer additive fields and messages. +- Never renumber existing fields. +- Reserve removals or semantic rewrites for an explicit version bump. + +## Transport Boundary + +- `proto-socket` owns `PacketBase`, heartbeat, nonce, and transport framing. +- ALT `alt.v1` messages are application payloads carried in `PacketBase.data`. + +## Codegen + +Generated outputs are committed source-of-derivation artifacts: + +- Go: `packages/contracts/gen/go/alt/v1/*.pb.go` (Go module `git.toki-labs.com/toki/alt/packages/contracts/gen/go`). +- Dart: `apps/client/lib/src/generated/alt/v1/*.pb*.dart`. + +Commands (run from repository root): + +- `bin/contracts-gen` regenerates Go and Dart outputs from `proto/`. Requires `protoc`, `protoc-gen-go`, and a working `apps/client` Flutter package (the Dart plugin is invoked via `apps/client/tool/protoc-gen-dart`). +- `bin/contracts-check` snapshots current generated outputs, regenerates, and fails when the regeneration produces a diff. Used by `bin/test` to keep schema and generated code aligned. + +Do not hand-edit files under `packages/contracts/gen/` or `apps/client/lib/src/generated/`. + diff --git a/packages/contracts/gen/go/alt/v1/backtest.pb.go b/packages/contracts/gen/go/alt/v1/backtest.pb.go new file mode 100644 index 0000000..1371336 --- /dev/null +++ b/packages/contracts/gen/go/alt/v1/backtest.pb.go @@ -0,0 +1,674 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v5.29.3 +// source: alt/v1/backtest.proto + +package altv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type BacktestRunStatus int32 + +const ( + BacktestRunStatus_BACKTEST_RUN_STATUS_UNSPECIFIED BacktestRunStatus = 0 + BacktestRunStatus_BACKTEST_RUN_STATUS_PENDING BacktestRunStatus = 1 + BacktestRunStatus_BACKTEST_RUN_STATUS_RUNNING BacktestRunStatus = 2 + BacktestRunStatus_BACKTEST_RUN_STATUS_SUCCEEDED BacktestRunStatus = 3 + BacktestRunStatus_BACKTEST_RUN_STATUS_FAILED BacktestRunStatus = 4 + BacktestRunStatus_BACKTEST_RUN_STATUS_CANCELED BacktestRunStatus = 5 +) + +// Enum value maps for BacktestRunStatus. +var ( + BacktestRunStatus_name = map[int32]string{ + 0: "BACKTEST_RUN_STATUS_UNSPECIFIED", + 1: "BACKTEST_RUN_STATUS_PENDING", + 2: "BACKTEST_RUN_STATUS_RUNNING", + 3: "BACKTEST_RUN_STATUS_SUCCEEDED", + 4: "BACKTEST_RUN_STATUS_FAILED", + 5: "BACKTEST_RUN_STATUS_CANCELED", + } + BacktestRunStatus_value = map[string]int32{ + "BACKTEST_RUN_STATUS_UNSPECIFIED": 0, + "BACKTEST_RUN_STATUS_PENDING": 1, + "BACKTEST_RUN_STATUS_RUNNING": 2, + "BACKTEST_RUN_STATUS_SUCCEEDED": 3, + "BACKTEST_RUN_STATUS_FAILED": 4, + "BACKTEST_RUN_STATUS_CANCELED": 5, + } +) + +func (x BacktestRunStatus) Enum() *BacktestRunStatus { + p := new(BacktestRunStatus) + *p = x + return p +} + +func (x BacktestRunStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BacktestRunStatus) Descriptor() protoreflect.EnumDescriptor { + return file_alt_v1_backtest_proto_enumTypes[0].Descriptor() +} + +func (BacktestRunStatus) Type() protoreflect.EnumType { + return &file_alt_v1_backtest_proto_enumTypes[0] +} + +func (x BacktestRunStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BacktestRunStatus.Descriptor instead. +func (BacktestRunStatus) EnumDescriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{0} +} + +type BacktestRunSpec struct { + state protoimpl.MessageState `protogen:"open.v1"` + StrategyId string `protobuf:"bytes,1,opt,name=strategy_id,json=strategyId,proto3" json:"strategy_id,omitempty"` + Market Market `protobuf:"varint,2,opt,name=market,proto3,enum=alt.v1.Market" json:"market,omitempty"` + Timeframe Timeframe `protobuf:"varint,3,opt,name=timeframe,proto3,enum=alt.v1.Timeframe" json:"timeframe,omitempty"` + FromUnixMs int64 `protobuf:"varint,4,opt,name=from_unix_ms,json=fromUnixMs,proto3" json:"from_unix_ms,omitempty"` + ToUnixMs int64 `protobuf:"varint,5,opt,name=to_unix_ms,json=toUnixMs,proto3" json:"to_unix_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BacktestRunSpec) Reset() { + *x = BacktestRunSpec{} + mi := &file_alt_v1_backtest_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BacktestRunSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BacktestRunSpec) ProtoMessage() {} + +func (x *BacktestRunSpec) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BacktestRunSpec.ProtoReflect.Descriptor instead. +func (*BacktestRunSpec) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{0} +} + +func (x *BacktestRunSpec) GetStrategyId() string { + if x != nil { + return x.StrategyId + } + return "" +} + +func (x *BacktestRunSpec) GetMarket() Market { + if x != nil { + return x.Market + } + return Market_MARKET_UNSPECIFIED +} + +func (x *BacktestRunSpec) GetTimeframe() Timeframe { + if x != nil { + return x.Timeframe + } + return Timeframe_TIMEFRAME_UNSPECIFIED +} + +func (x *BacktestRunSpec) GetFromUnixMs() int64 { + if x != nil { + return x.FromUnixMs + } + return 0 +} + +func (x *BacktestRunSpec) GetToUnixMs() int64 { + if x != nil { + return x.ToUnixMs + } + return 0 +} + +type BacktestRun struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Spec *BacktestRunSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` + Status BacktestRunStatus `protobuf:"varint,3,opt,name=status,proto3,enum=alt.v1.BacktestRunStatus" json:"status,omitempty"` + CreatedAtUnixMs int64 `protobuf:"varint,4,opt,name=created_at_unix_ms,json=createdAtUnixMs,proto3" json:"created_at_unix_ms,omitempty"` + UpdatedAtUnixMs int64 `protobuf:"varint,5,opt,name=updated_at_unix_ms,json=updatedAtUnixMs,proto3" json:"updated_at_unix_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BacktestRun) Reset() { + *x = BacktestRun{} + mi := &file_alt_v1_backtest_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BacktestRun) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BacktestRun) ProtoMessage() {} + +func (x *BacktestRun) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BacktestRun.ProtoReflect.Descriptor instead. +func (*BacktestRun) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{1} +} + +func (x *BacktestRun) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *BacktestRun) GetSpec() *BacktestRunSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *BacktestRun) GetStatus() BacktestRunStatus { + if x != nil { + return x.Status + } + return BacktestRunStatus_BACKTEST_RUN_STATUS_UNSPECIFIED +} + +func (x *BacktestRun) GetCreatedAtUnixMs() int64 { + if x != nil { + return x.CreatedAtUnixMs + } + return 0 +} + +func (x *BacktestRun) GetUpdatedAtUnixMs() int64 { + if x != nil { + return x.UpdatedAtUnixMs + } + return 0 +} + +type StartBacktestRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Spec *BacktestRunSpec `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StartBacktestRequest) Reset() { + *x = StartBacktestRequest{} + mi := &file_alt_v1_backtest_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StartBacktestRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartBacktestRequest) ProtoMessage() {} + +func (x *StartBacktestRequest) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartBacktestRequest.ProtoReflect.Descriptor instead. +func (*StartBacktestRequest) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{2} +} + +func (x *StartBacktestRequest) GetSpec() *BacktestRunSpec { + if x != nil { + return x.Spec + } + return nil +} + +type StartBacktestResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Run *BacktestRun `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *StartBacktestResponse) Reset() { + *x = StartBacktestResponse{} + mi := &file_alt_v1_backtest_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *StartBacktestResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartBacktestResponse) ProtoMessage() {} + +func (x *StartBacktestResponse) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartBacktestResponse.ProtoReflect.Descriptor instead. +func (*StartBacktestResponse) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{3} +} + +func (x *StartBacktestResponse) GetRun() *BacktestRun { + if x != nil { + return x.Run + } + return nil +} + +type GetBacktestRunRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetBacktestRunRequest) Reset() { + *x = GetBacktestRunRequest{} + mi := &file_alt_v1_backtest_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetBacktestRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBacktestRunRequest) ProtoMessage() {} + +func (x *GetBacktestRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetBacktestRunRequest.ProtoReflect.Descriptor instead. +func (*GetBacktestRunRequest) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{4} +} + +func (x *GetBacktestRunRequest) GetRunId() string { + if x != nil { + return x.RunId + } + return "" +} + +type GetBacktestRunResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Run *BacktestRun `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetBacktestRunResponse) Reset() { + *x = GetBacktestRunResponse{} + mi := &file_alt_v1_backtest_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetBacktestRunResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBacktestRunResponse) ProtoMessage() {} + +func (x *GetBacktestRunResponse) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetBacktestRunResponse.ProtoReflect.Descriptor instead. +func (*GetBacktestRunResponse) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{5} +} + +func (x *GetBacktestRunResponse) GetRun() *BacktestRun { + if x != nil { + return x.Run + } + return nil +} + +type BacktestResult struct { + state protoimpl.MessageState `protogen:"open.v1"` + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` + StartingCash *Price `protobuf:"bytes,2,opt,name=starting_cash,json=startingCash,proto3" json:"starting_cash,omitempty"` + EndingEquity *Price `protobuf:"bytes,3,opt,name=ending_equity,json=endingEquity,proto3" json:"ending_equity,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BacktestResult) Reset() { + *x = BacktestResult{} + mi := &file_alt_v1_backtest_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BacktestResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BacktestResult) ProtoMessage() {} + +func (x *BacktestResult) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BacktestResult.ProtoReflect.Descriptor instead. +func (*BacktestResult) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{6} +} + +func (x *BacktestResult) GetRunId() string { + if x != nil { + return x.RunId + } + return "" +} + +func (x *BacktestResult) GetStartingCash() *Price { + if x != nil { + return x.StartingCash + } + return nil +} + +func (x *BacktestResult) GetEndingEquity() *Price { + if x != nil { + return x.EndingEquity + } + return nil +} + +type GetBacktestResultRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetBacktestResultRequest) Reset() { + *x = GetBacktestResultRequest{} + mi := &file_alt_v1_backtest_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetBacktestResultRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBacktestResultRequest) ProtoMessage() {} + +func (x *GetBacktestResultRequest) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetBacktestResultRequest.ProtoReflect.Descriptor instead. +func (*GetBacktestResultRequest) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{7} +} + +func (x *GetBacktestResultRequest) GetRunId() string { + if x != nil { + return x.RunId + } + return "" +} + +type GetBacktestResultResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Result *BacktestResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetBacktestResultResponse) Reset() { + *x = GetBacktestResultResponse{} + mi := &file_alt_v1_backtest_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetBacktestResultResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetBacktestResultResponse) ProtoMessage() {} + +func (x *GetBacktestResultResponse) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_backtest_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetBacktestResultResponse.ProtoReflect.Descriptor instead. +func (*GetBacktestResultResponse) Descriptor() ([]byte, []int) { + return file_alt_v1_backtest_proto_rawDescGZIP(), []int{8} +} + +func (x *GetBacktestResultResponse) GetResult() *BacktestResult { + if x != nil { + return x.Result + } + return nil +} + +var File_alt_v1_backtest_proto protoreflect.FileDescriptor + +const file_alt_v1_backtest_proto_rawDesc = "" + + "\n" + + "\x15alt/v1/backtest.proto\x12\x06alt.v1\x1a\x13alt/v1/common.proto\x1a\x13alt/v1/market.proto\"\xcb\x01\n" + + "\x0fBacktestRunSpec\x12\x1f\n" + + "\vstrategy_id\x18\x01 \x01(\tR\n" + + "strategyId\x12&\n" + + "\x06market\x18\x02 \x01(\x0e2\x0e.alt.v1.MarketR\x06market\x12/\n" + + "\ttimeframe\x18\x03 \x01(\x0e2\x11.alt.v1.TimeframeR\ttimeframe\x12 \n" + + "\ffrom_unix_ms\x18\x04 \x01(\x03R\n" + + "fromUnixMs\x12\x1c\n" + + "\n" + + "to_unix_ms\x18\x05 \x01(\x03R\btoUnixMs\"\xd7\x01\n" + + "\vBacktestRun\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12+\n" + + "\x04spec\x18\x02 \x01(\v2\x17.alt.v1.BacktestRunSpecR\x04spec\x121\n" + + "\x06status\x18\x03 \x01(\x0e2\x19.alt.v1.BacktestRunStatusR\x06status\x12+\n" + + "\x12created_at_unix_ms\x18\x04 \x01(\x03R\x0fcreatedAtUnixMs\x12+\n" + + "\x12updated_at_unix_ms\x18\x05 \x01(\x03R\x0fupdatedAtUnixMs\"C\n" + + "\x14StartBacktestRequest\x12+\n" + + "\x04spec\x18\x01 \x01(\v2\x17.alt.v1.BacktestRunSpecR\x04spec\">\n" + + "\x15StartBacktestResponse\x12%\n" + + "\x03run\x18\x01 \x01(\v2\x13.alt.v1.BacktestRunR\x03run\".\n" + + "\x15GetBacktestRunRequest\x12\x15\n" + + "\x06run_id\x18\x01 \x01(\tR\x05runId\"?\n" + + "\x16GetBacktestRunResponse\x12%\n" + + "\x03run\x18\x01 \x01(\v2\x13.alt.v1.BacktestRunR\x03run\"\x8f\x01\n" + + "\x0eBacktestResult\x12\x15\n" + + "\x06run_id\x18\x01 \x01(\tR\x05runId\x122\n" + + "\rstarting_cash\x18\x02 \x01(\v2\r.alt.v1.PriceR\fstartingCash\x122\n" + + "\rending_equity\x18\x03 \x01(\v2\r.alt.v1.PriceR\fendingEquity\"1\n" + + "\x18GetBacktestResultRequest\x12\x15\n" + + "\x06run_id\x18\x01 \x01(\tR\x05runId\"K\n" + + "\x19GetBacktestResultResponse\x12.\n" + + "\x06result\x18\x01 \x01(\v2\x16.alt.v1.BacktestResultR\x06result*\xdf\x01\n" + + "\x11BacktestRunStatus\x12#\n" + + "\x1fBACKTEST_RUN_STATUS_UNSPECIFIED\x10\x00\x12\x1f\n" + + "\x1bBACKTEST_RUN_STATUS_PENDING\x10\x01\x12\x1f\n" + + "\x1bBACKTEST_RUN_STATUS_RUNNING\x10\x02\x12!\n" + + "\x1dBACKTEST_RUN_STATUS_SUCCEEDED\x10\x03\x12\x1e\n" + + "\x1aBACKTEST_RUN_STATUS_FAILED\x10\x04\x12 \n" + + "\x1cBACKTEST_RUN_STATUS_CANCELED\x10\x05BCZAgit.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1;altv1b\x06proto3" + +var ( + file_alt_v1_backtest_proto_rawDescOnce sync.Once + file_alt_v1_backtest_proto_rawDescData []byte +) + +func file_alt_v1_backtest_proto_rawDescGZIP() []byte { + file_alt_v1_backtest_proto_rawDescOnce.Do(func() { + file_alt_v1_backtest_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_alt_v1_backtest_proto_rawDesc), len(file_alt_v1_backtest_proto_rawDesc))) + }) + return file_alt_v1_backtest_proto_rawDescData +} + +var file_alt_v1_backtest_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_alt_v1_backtest_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_alt_v1_backtest_proto_goTypes = []any{ + (BacktestRunStatus)(0), // 0: alt.v1.BacktestRunStatus + (*BacktestRunSpec)(nil), // 1: alt.v1.BacktestRunSpec + (*BacktestRun)(nil), // 2: alt.v1.BacktestRun + (*StartBacktestRequest)(nil), // 3: alt.v1.StartBacktestRequest + (*StartBacktestResponse)(nil), // 4: alt.v1.StartBacktestResponse + (*GetBacktestRunRequest)(nil), // 5: alt.v1.GetBacktestRunRequest + (*GetBacktestRunResponse)(nil), // 6: alt.v1.GetBacktestRunResponse + (*BacktestResult)(nil), // 7: alt.v1.BacktestResult + (*GetBacktestResultRequest)(nil), // 8: alt.v1.GetBacktestResultRequest + (*GetBacktestResultResponse)(nil), // 9: alt.v1.GetBacktestResultResponse + (Market)(0), // 10: alt.v1.Market + (Timeframe)(0), // 11: alt.v1.Timeframe + (*Price)(nil), // 12: alt.v1.Price +} +var file_alt_v1_backtest_proto_depIdxs = []int32{ + 10, // 0: alt.v1.BacktestRunSpec.market:type_name -> alt.v1.Market + 11, // 1: alt.v1.BacktestRunSpec.timeframe:type_name -> alt.v1.Timeframe + 1, // 2: alt.v1.BacktestRun.spec:type_name -> alt.v1.BacktestRunSpec + 0, // 3: alt.v1.BacktestRun.status:type_name -> alt.v1.BacktestRunStatus + 1, // 4: alt.v1.StartBacktestRequest.spec:type_name -> alt.v1.BacktestRunSpec + 2, // 5: alt.v1.StartBacktestResponse.run:type_name -> alt.v1.BacktestRun + 2, // 6: alt.v1.GetBacktestRunResponse.run:type_name -> alt.v1.BacktestRun + 12, // 7: alt.v1.BacktestResult.starting_cash:type_name -> alt.v1.Price + 12, // 8: alt.v1.BacktestResult.ending_equity:type_name -> alt.v1.Price + 7, // 9: alt.v1.GetBacktestResultResponse.result:type_name -> alt.v1.BacktestResult + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_alt_v1_backtest_proto_init() } +func file_alt_v1_backtest_proto_init() { + if File_alt_v1_backtest_proto != nil { + return + } + file_alt_v1_common_proto_init() + file_alt_v1_market_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_alt_v1_backtest_proto_rawDesc), len(file_alt_v1_backtest_proto_rawDesc)), + NumEnums: 1, + NumMessages: 9, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_alt_v1_backtest_proto_goTypes, + DependencyIndexes: file_alt_v1_backtest_proto_depIdxs, + EnumInfos: file_alt_v1_backtest_proto_enumTypes, + MessageInfos: file_alt_v1_backtest_proto_msgTypes, + }.Build() + File_alt_v1_backtest_proto = out.File + file_alt_v1_backtest_proto_goTypes = nil + file_alt_v1_backtest_proto_depIdxs = nil +} diff --git a/packages/contracts/gen/go/alt/v1/common.pb.go b/packages/contracts/gen/go/alt/v1/common.pb.go new file mode 100644 index 0000000..b1afd90 --- /dev/null +++ b/packages/contracts/gen/go/alt/v1/common.pb.go @@ -0,0 +1,546 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v5.29.3 +// source: alt/v1/common.proto + +package altv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Market int32 + +const ( + Market_MARKET_UNSPECIFIED Market = 0 + Market_MARKET_KR Market = 1 + Market_MARKET_US Market = 2 +) + +// Enum value maps for Market. +var ( + Market_name = map[int32]string{ + 0: "MARKET_UNSPECIFIED", + 1: "MARKET_KR", + 2: "MARKET_US", + } + Market_value = map[string]int32{ + "MARKET_UNSPECIFIED": 0, + "MARKET_KR": 1, + "MARKET_US": 2, + } +) + +func (x Market) Enum() *Market { + p := new(Market) + *p = x + return p +} + +func (x Market) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Market) Descriptor() protoreflect.EnumDescriptor { + return file_alt_v1_common_proto_enumTypes[0].Descriptor() +} + +func (Market) Type() protoreflect.EnumType { + return &file_alt_v1_common_proto_enumTypes[0] +} + +func (x Market) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Market.Descriptor instead. +func (Market) EnumDescriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{0} +} + +type Venue int32 + +const ( + Venue_VENUE_UNSPECIFIED Venue = 0 + Venue_VENUE_KRX Venue = 1 + Venue_VENUE_NASDAQ Venue = 2 + Venue_VENUE_NYSE Venue = 3 +) + +// Enum value maps for Venue. +var ( + Venue_name = map[int32]string{ + 0: "VENUE_UNSPECIFIED", + 1: "VENUE_KRX", + 2: "VENUE_NASDAQ", + 3: "VENUE_NYSE", + } + Venue_value = map[string]int32{ + "VENUE_UNSPECIFIED": 0, + "VENUE_KRX": 1, + "VENUE_NASDAQ": 2, + "VENUE_NYSE": 3, + } +) + +func (x Venue) Enum() *Venue { + p := new(Venue) + *p = x + return p +} + +func (x Venue) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Venue) Descriptor() protoreflect.EnumDescriptor { + return file_alt_v1_common_proto_enumTypes[1].Descriptor() +} + +func (Venue) Type() protoreflect.EnumType { + return &file_alt_v1_common_proto_enumTypes[1] +} + +func (x Venue) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Venue.Descriptor instead. +func (Venue) EnumDescriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{1} +} + +type Currency int32 + +const ( + Currency_CURRENCY_UNSPECIFIED Currency = 0 + Currency_CURRENCY_KRW Currency = 1 + Currency_CURRENCY_USD Currency = 2 +) + +// Enum value maps for Currency. +var ( + Currency_name = map[int32]string{ + 0: "CURRENCY_UNSPECIFIED", + 1: "CURRENCY_KRW", + 2: "CURRENCY_USD", + } + Currency_value = map[string]int32{ + "CURRENCY_UNSPECIFIED": 0, + "CURRENCY_KRW": 1, + "CURRENCY_USD": 2, + } +) + +func (x Currency) Enum() *Currency { + p := new(Currency) + *p = x + return p +} + +func (x Currency) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Currency) Descriptor() protoreflect.EnumDescriptor { + return file_alt_v1_common_proto_enumTypes[2].Descriptor() +} + +func (Currency) Type() protoreflect.EnumType { + return &file_alt_v1_common_proto_enumTypes[2] +} + +func (x Currency) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Currency.Descriptor instead. +func (Currency) EnumDescriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{2} +} + +type Timeframe int32 + +const ( + Timeframe_TIMEFRAME_UNSPECIFIED Timeframe = 0 + Timeframe_TIMEFRAME_DAILY Timeframe = 1 + Timeframe_TIMEFRAME_MINUTE_1 Timeframe = 2 + Timeframe_TIMEFRAME_MINUTE_5 Timeframe = 3 +) + +// Enum value maps for Timeframe. +var ( + Timeframe_name = map[int32]string{ + 0: "TIMEFRAME_UNSPECIFIED", + 1: "TIMEFRAME_DAILY", + 2: "TIMEFRAME_MINUTE_1", + 3: "TIMEFRAME_MINUTE_5", + } + Timeframe_value = map[string]int32{ + "TIMEFRAME_UNSPECIFIED": 0, + "TIMEFRAME_DAILY": 1, + "TIMEFRAME_MINUTE_1": 2, + "TIMEFRAME_MINUTE_5": 3, + } +) + +func (x Timeframe) Enum() *Timeframe { + p := new(Timeframe) + *p = x + return p +} + +func (x Timeframe) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Timeframe) Descriptor() protoreflect.EnumDescriptor { + return file_alt_v1_common_proto_enumTypes[3].Descriptor() +} + +func (Timeframe) Type() protoreflect.EnumType { + return &file_alt_v1_common_proto_enumTypes[3] +} + +func (x Timeframe) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Timeframe.Descriptor instead. +func (Timeframe) EnumDescriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{3} +} + +type Decimal struct { + state protoimpl.MessageState `protogen:"open.v1"` + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Decimal) Reset() { + *x = Decimal{} + mi := &file_alt_v1_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Decimal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Decimal) ProtoMessage() {} + +func (x *Decimal) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_common_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Decimal.ProtoReflect.Descriptor instead. +func (*Decimal) Descriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{0} +} + +func (x *Decimal) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +type ErrorInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ErrorInfo) Reset() { + *x = ErrorInfo{} + mi := &file_alt_v1_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ErrorInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ErrorInfo) ProtoMessage() {} + +func (x *ErrorInfo) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_common_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ErrorInfo.ProtoReflect.Descriptor instead. +func (*ErrorInfo) Descriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{1} +} + +func (x *ErrorInfo) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +func (x *ErrorInfo) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type HelloRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ClientName string `protobuf:"bytes,1,opt,name=client_name,json=clientName,proto3" json:"client_name,omitempty"` + ClientVersion string `protobuf:"bytes,2,opt,name=client_version,json=clientVersion,proto3" json:"client_version,omitempty"` + AltProtocolVersion string `protobuf:"bytes,3,opt,name=alt_protocol_version,json=altProtocolVersion,proto3" json:"alt_protocol_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HelloRequest) Reset() { + *x = HelloRequest{} + mi := &file_alt_v1_common_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HelloRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HelloRequest) ProtoMessage() {} + +func (x *HelloRequest) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_common_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead. +func (*HelloRequest) Descriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{2} +} + +func (x *HelloRequest) GetClientName() string { + if x != nil { + return x.ClientName + } + return "" +} + +func (x *HelloRequest) GetClientVersion() string { + if x != nil { + return x.ClientVersion + } + return "" +} + +func (x *HelloRequest) GetAltProtocolVersion() string { + if x != nil { + return x.AltProtocolVersion + } + return "" +} + +type HelloResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ServerName string `protobuf:"bytes,1,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` + ServerVersion string `protobuf:"bytes,2,opt,name=server_version,json=serverVersion,proto3" json:"server_version,omitempty"` + AltProtocolVersion string `protobuf:"bytes,3,opt,name=alt_protocol_version,json=altProtocolVersion,proto3" json:"alt_protocol_version,omitempty"` + Capabilities []string `protobuf:"bytes,4,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HelloResponse) Reset() { + *x = HelloResponse{} + mi := &file_alt_v1_common_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HelloResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HelloResponse) ProtoMessage() {} + +func (x *HelloResponse) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_common_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HelloResponse.ProtoReflect.Descriptor instead. +func (*HelloResponse) Descriptor() ([]byte, []int) { + return file_alt_v1_common_proto_rawDescGZIP(), []int{3} +} + +func (x *HelloResponse) GetServerName() string { + if x != nil { + return x.ServerName + } + return "" +} + +func (x *HelloResponse) GetServerVersion() string { + if x != nil { + return x.ServerVersion + } + return "" +} + +func (x *HelloResponse) GetAltProtocolVersion() string { + if x != nil { + return x.AltProtocolVersion + } + return "" +} + +func (x *HelloResponse) GetCapabilities() []string { + if x != nil { + return x.Capabilities + } + return nil +} + +var File_alt_v1_common_proto protoreflect.FileDescriptor + +const file_alt_v1_common_proto_rawDesc = "" + + "\n" + + "\x13alt/v1/common.proto\x12\x06alt.v1\"\x1f\n" + + "\aDecimal\x12\x14\n" + + "\x05value\x18\x01 \x01(\tR\x05value\"9\n" + + "\tErrorInfo\x12\x12\n" + + "\x04code\x18\x01 \x01(\tR\x04code\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\"\x88\x01\n" + + "\fHelloRequest\x12\x1f\n" + + "\vclient_name\x18\x01 \x01(\tR\n" + + "clientName\x12%\n" + + "\x0eclient_version\x18\x02 \x01(\tR\rclientVersion\x120\n" + + "\x14alt_protocol_version\x18\x03 \x01(\tR\x12altProtocolVersion\"\xad\x01\n" + + "\rHelloResponse\x12\x1f\n" + + "\vserver_name\x18\x01 \x01(\tR\n" + + "serverName\x12%\n" + + "\x0eserver_version\x18\x02 \x01(\tR\rserverVersion\x120\n" + + "\x14alt_protocol_version\x18\x03 \x01(\tR\x12altProtocolVersion\x12\"\n" + + "\fcapabilities\x18\x04 \x03(\tR\fcapabilities*>\n" + + "\x06Market\x12\x16\n" + + "\x12MARKET_UNSPECIFIED\x10\x00\x12\r\n" + + "\tMARKET_KR\x10\x01\x12\r\n" + + "\tMARKET_US\x10\x02*O\n" + + "\x05Venue\x12\x15\n" + + "\x11VENUE_UNSPECIFIED\x10\x00\x12\r\n" + + "\tVENUE_KRX\x10\x01\x12\x10\n" + + "\fVENUE_NASDAQ\x10\x02\x12\x0e\n" + + "\n" + + "VENUE_NYSE\x10\x03*H\n" + + "\bCurrency\x12\x18\n" + + "\x14CURRENCY_UNSPECIFIED\x10\x00\x12\x10\n" + + "\fCURRENCY_KRW\x10\x01\x12\x10\n" + + "\fCURRENCY_USD\x10\x02*k\n" + + "\tTimeframe\x12\x19\n" + + "\x15TIMEFRAME_UNSPECIFIED\x10\x00\x12\x13\n" + + "\x0fTIMEFRAME_DAILY\x10\x01\x12\x16\n" + + "\x12TIMEFRAME_MINUTE_1\x10\x02\x12\x16\n" + + "\x12TIMEFRAME_MINUTE_5\x10\x03BCZAgit.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1;altv1b\x06proto3" + +var ( + file_alt_v1_common_proto_rawDescOnce sync.Once + file_alt_v1_common_proto_rawDescData []byte +) + +func file_alt_v1_common_proto_rawDescGZIP() []byte { + file_alt_v1_common_proto_rawDescOnce.Do(func() { + file_alt_v1_common_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_alt_v1_common_proto_rawDesc), len(file_alt_v1_common_proto_rawDesc))) + }) + return file_alt_v1_common_proto_rawDescData +} + +var file_alt_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_alt_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_alt_v1_common_proto_goTypes = []any{ + (Market)(0), // 0: alt.v1.Market + (Venue)(0), // 1: alt.v1.Venue + (Currency)(0), // 2: alt.v1.Currency + (Timeframe)(0), // 3: alt.v1.Timeframe + (*Decimal)(nil), // 4: alt.v1.Decimal + (*ErrorInfo)(nil), // 5: alt.v1.ErrorInfo + (*HelloRequest)(nil), // 6: alt.v1.HelloRequest + (*HelloResponse)(nil), // 7: alt.v1.HelloResponse +} +var file_alt_v1_common_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_alt_v1_common_proto_init() } +func file_alt_v1_common_proto_init() { + if File_alt_v1_common_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_alt_v1_common_proto_rawDesc), len(file_alt_v1_common_proto_rawDesc)), + NumEnums: 4, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_alt_v1_common_proto_goTypes, + DependencyIndexes: file_alt_v1_common_proto_depIdxs, + EnumInfos: file_alt_v1_common_proto_enumTypes, + MessageInfos: file_alt_v1_common_proto_msgTypes, + }.Build() + File_alt_v1_common_proto = out.File + file_alt_v1_common_proto_goTypes = nil + file_alt_v1_common_proto_depIdxs = nil +} diff --git a/packages/contracts/gen/go/alt/v1/market.pb.go b/packages/contracts/gen/go/alt/v1/market.pb.go new file mode 100644 index 0000000..1a35527 --- /dev/null +++ b/packages/contracts/gen/go/alt/v1/market.pb.go @@ -0,0 +1,643 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v5.29.3 +// source: alt/v1/market.proto + +package altv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Instrument struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Market Market `protobuf:"varint,2,opt,name=market,proto3,enum=alt.v1.Market" json:"market,omitempty"` + Venue Venue `protobuf:"varint,3,opt,name=venue,proto3,enum=alt.v1.Venue" json:"venue,omitempty"` + Symbol string `protobuf:"bytes,4,opt,name=symbol,proto3" json:"symbol,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + Currency Currency `protobuf:"varint,6,opt,name=currency,proto3,enum=alt.v1.Currency" json:"currency,omitempty"` + ProviderSymbols map[string]string `protobuf:"bytes,7,rep,name=provider_symbols,json=providerSymbols,proto3" json:"provider_symbols,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Instrument) Reset() { + *x = Instrument{} + mi := &file_alt_v1_market_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Instrument) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Instrument) ProtoMessage() {} + +func (x *Instrument) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Instrument.ProtoReflect.Descriptor instead. +func (*Instrument) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{0} +} + +func (x *Instrument) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Instrument) GetMarket() Market { + if x != nil { + return x.Market + } + return Market_MARKET_UNSPECIFIED +} + +func (x *Instrument) GetVenue() Venue { + if x != nil { + return x.Venue + } + return Venue_VENUE_UNSPECIFIED +} + +func (x *Instrument) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +func (x *Instrument) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Instrument) GetCurrency() Currency { + if x != nil { + return x.Currency + } + return Currency_CURRENCY_UNSPECIFIED +} + +func (x *Instrument) GetProviderSymbols() map[string]string { + if x != nil { + return x.ProviderSymbols + } + return nil +} + +type Price struct { + state protoimpl.MessageState `protogen:"open.v1"` + Currency Currency `protobuf:"varint,1,opt,name=currency,proto3,enum=alt.v1.Currency" json:"currency,omitempty"` + Amount *Decimal `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Price) Reset() { + *x = Price{} + mi := &file_alt_v1_market_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Price) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Price) ProtoMessage() {} + +func (x *Price) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Price.ProtoReflect.Descriptor instead. +func (*Price) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{1} +} + +func (x *Price) GetCurrency() Currency { + if x != nil { + return x.Currency + } + return Currency_CURRENCY_UNSPECIFIED +} + +func (x *Price) GetAmount() *Decimal { + if x != nil { + return x.Amount + } + return nil +} + +type Quantity struct { + state protoimpl.MessageState `protogen:"open.v1"` + Amount *Decimal `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Quantity) Reset() { + *x = Quantity{} + mi := &file_alt_v1_market_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Quantity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Quantity) ProtoMessage() {} + +func (x *Quantity) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Quantity.ProtoReflect.Descriptor instead. +func (*Quantity) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{2} +} + +func (x *Quantity) GetAmount() *Decimal { + if x != nil { + return x.Amount + } + return nil +} + +type Bar struct { + state protoimpl.MessageState `protogen:"open.v1"` + InstrumentId string `protobuf:"bytes,1,opt,name=instrument_id,json=instrumentId,proto3" json:"instrument_id,omitempty"` + Timeframe Timeframe `protobuf:"varint,2,opt,name=timeframe,proto3,enum=alt.v1.Timeframe" json:"timeframe,omitempty"` + TimestampUnixMs int64 `protobuf:"varint,3,opt,name=timestamp_unix_ms,json=timestampUnixMs,proto3" json:"timestamp_unix_ms,omitempty"` + Open *Price `protobuf:"bytes,4,opt,name=open,proto3" json:"open,omitempty"` + High *Price `protobuf:"bytes,5,opt,name=high,proto3" json:"high,omitempty"` + Low *Price `protobuf:"bytes,6,opt,name=low,proto3" json:"low,omitempty"` + Close *Price `protobuf:"bytes,7,opt,name=close,proto3" json:"close,omitempty"` + Volume *Quantity `protobuf:"bytes,8,opt,name=volume,proto3" json:"volume,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Bar) Reset() { + *x = Bar{} + mi := &file_alt_v1_market_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Bar) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Bar) ProtoMessage() {} + +func (x *Bar) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Bar.ProtoReflect.Descriptor instead. +func (*Bar) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{3} +} + +func (x *Bar) GetInstrumentId() string { + if x != nil { + return x.InstrumentId + } + return "" +} + +func (x *Bar) GetTimeframe() Timeframe { + if x != nil { + return x.Timeframe + } + return Timeframe_TIMEFRAME_UNSPECIFIED +} + +func (x *Bar) GetTimestampUnixMs() int64 { + if x != nil { + return x.TimestampUnixMs + } + return 0 +} + +func (x *Bar) GetOpen() *Price { + if x != nil { + return x.Open + } + return nil +} + +func (x *Bar) GetHigh() *Price { + if x != nil { + return x.High + } + return nil +} + +func (x *Bar) GetLow() *Price { + if x != nil { + return x.Low + } + return nil +} + +func (x *Bar) GetClose() *Price { + if x != nil { + return x.Close + } + return nil +} + +func (x *Bar) GetVolume() *Quantity { + if x != nil { + return x.Volume + } + return nil +} + +type ListInstrumentsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Market Market `protobuf:"varint,1,opt,name=market,proto3,enum=alt.v1.Market" json:"market,omitempty"` + Provider string `protobuf:"bytes,2,opt,name=provider,proto3" json:"provider,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListInstrumentsRequest) Reset() { + *x = ListInstrumentsRequest{} + mi := &file_alt_v1_market_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListInstrumentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListInstrumentsRequest) ProtoMessage() {} + +func (x *ListInstrumentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListInstrumentsRequest.ProtoReflect.Descriptor instead. +func (*ListInstrumentsRequest) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{4} +} + +func (x *ListInstrumentsRequest) GetMarket() Market { + if x != nil { + return x.Market + } + return Market_MARKET_UNSPECIFIED +} + +func (x *ListInstrumentsRequest) GetProvider() string { + if x != nil { + return x.Provider + } + return "" +} + +type ListInstrumentsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Instruments []*Instrument `protobuf:"bytes,1,rep,name=instruments,proto3" json:"instruments,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListInstrumentsResponse) Reset() { + *x = ListInstrumentsResponse{} + mi := &file_alt_v1_market_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListInstrumentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListInstrumentsResponse) ProtoMessage() {} + +func (x *ListInstrumentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListInstrumentsResponse.ProtoReflect.Descriptor instead. +func (*ListInstrumentsResponse) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{5} +} + +func (x *ListInstrumentsResponse) GetInstruments() []*Instrument { + if x != nil { + return x.Instruments + } + return nil +} + +type ListBarsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + InstrumentId string `protobuf:"bytes,1,opt,name=instrument_id,json=instrumentId,proto3" json:"instrument_id,omitempty"` + Timeframe Timeframe `protobuf:"varint,2,opt,name=timeframe,proto3,enum=alt.v1.Timeframe" json:"timeframe,omitempty"` + FromUnixMs int64 `protobuf:"varint,3,opt,name=from_unix_ms,json=fromUnixMs,proto3" json:"from_unix_ms,omitempty"` + ToUnixMs int64 `protobuf:"varint,4,opt,name=to_unix_ms,json=toUnixMs,proto3" json:"to_unix_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListBarsRequest) Reset() { + *x = ListBarsRequest{} + mi := &file_alt_v1_market_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListBarsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListBarsRequest) ProtoMessage() {} + +func (x *ListBarsRequest) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListBarsRequest.ProtoReflect.Descriptor instead. +func (*ListBarsRequest) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{6} +} + +func (x *ListBarsRequest) GetInstrumentId() string { + if x != nil { + return x.InstrumentId + } + return "" +} + +func (x *ListBarsRequest) GetTimeframe() Timeframe { + if x != nil { + return x.Timeframe + } + return Timeframe_TIMEFRAME_UNSPECIFIED +} + +func (x *ListBarsRequest) GetFromUnixMs() int64 { + if x != nil { + return x.FromUnixMs + } + return 0 +} + +func (x *ListBarsRequest) GetToUnixMs() int64 { + if x != nil { + return x.ToUnixMs + } + return 0 +} + +type ListBarsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Bars []*Bar `protobuf:"bytes,1,rep,name=bars,proto3" json:"bars,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListBarsResponse) Reset() { + *x = ListBarsResponse{} + mi := &file_alt_v1_market_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListBarsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListBarsResponse) ProtoMessage() {} + +func (x *ListBarsResponse) ProtoReflect() protoreflect.Message { + mi := &file_alt_v1_market_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListBarsResponse.ProtoReflect.Descriptor instead. +func (*ListBarsResponse) Descriptor() ([]byte, []int) { + return file_alt_v1_market_proto_rawDescGZIP(), []int{7} +} + +func (x *ListBarsResponse) GetBars() []*Bar { + if x != nil { + return x.Bars + } + return nil +} + +var File_alt_v1_market_proto protoreflect.FileDescriptor + +const file_alt_v1_market_proto_rawDesc = "" + + "\n" + + "\x13alt/v1/market.proto\x12\x06alt.v1\x1a\x13alt/v1/common.proto\"\xdb\x02\n" + + "\n" + + "Instrument\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12&\n" + + "\x06market\x18\x02 \x01(\x0e2\x0e.alt.v1.MarketR\x06market\x12#\n" + + "\x05venue\x18\x03 \x01(\x0e2\r.alt.v1.VenueR\x05venue\x12\x16\n" + + "\x06symbol\x18\x04 \x01(\tR\x06symbol\x12\x12\n" + + "\x04name\x18\x05 \x01(\tR\x04name\x12,\n" + + "\bcurrency\x18\x06 \x01(\x0e2\x10.alt.v1.CurrencyR\bcurrency\x12R\n" + + "\x10provider_symbols\x18\a \x03(\v2'.alt.v1.Instrument.ProviderSymbolsEntryR\x0fproviderSymbols\x1aB\n" + + "\x14ProviderSymbolsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"^\n" + + "\x05Price\x12,\n" + + "\bcurrency\x18\x01 \x01(\x0e2\x10.alt.v1.CurrencyR\bcurrency\x12'\n" + + "\x06amount\x18\x02 \x01(\v2\x0f.alt.v1.DecimalR\x06amount\"3\n" + + "\bQuantity\x12'\n" + + "\x06amount\x18\x01 \x01(\v2\x0f.alt.v1.DecimalR\x06amount\"\xbd\x02\n" + + "\x03Bar\x12#\n" + + "\rinstrument_id\x18\x01 \x01(\tR\finstrumentId\x12/\n" + + "\ttimeframe\x18\x02 \x01(\x0e2\x11.alt.v1.TimeframeR\ttimeframe\x12*\n" + + "\x11timestamp_unix_ms\x18\x03 \x01(\x03R\x0ftimestampUnixMs\x12!\n" + + "\x04open\x18\x04 \x01(\v2\r.alt.v1.PriceR\x04open\x12!\n" + + "\x04high\x18\x05 \x01(\v2\r.alt.v1.PriceR\x04high\x12\x1f\n" + + "\x03low\x18\x06 \x01(\v2\r.alt.v1.PriceR\x03low\x12#\n" + + "\x05close\x18\a \x01(\v2\r.alt.v1.PriceR\x05close\x12(\n" + + "\x06volume\x18\b \x01(\v2\x10.alt.v1.QuantityR\x06volume\"\\\n" + + "\x16ListInstrumentsRequest\x12&\n" + + "\x06market\x18\x01 \x01(\x0e2\x0e.alt.v1.MarketR\x06market\x12\x1a\n" + + "\bprovider\x18\x02 \x01(\tR\bprovider\"O\n" + + "\x17ListInstrumentsResponse\x124\n" + + "\vinstruments\x18\x01 \x03(\v2\x12.alt.v1.InstrumentR\vinstruments\"\xa7\x01\n" + + "\x0fListBarsRequest\x12#\n" + + "\rinstrument_id\x18\x01 \x01(\tR\finstrumentId\x12/\n" + + "\ttimeframe\x18\x02 \x01(\x0e2\x11.alt.v1.TimeframeR\ttimeframe\x12 \n" + + "\ffrom_unix_ms\x18\x03 \x01(\x03R\n" + + "fromUnixMs\x12\x1c\n" + + "\n" + + "to_unix_ms\x18\x04 \x01(\x03R\btoUnixMs\"3\n" + + "\x10ListBarsResponse\x12\x1f\n" + + "\x04bars\x18\x01 \x03(\v2\v.alt.v1.BarR\x04barsBCZAgit.toki-labs.com/toki/alt/packages/contracts/gen/go/alt/v1;altv1b\x06proto3" + +var ( + file_alt_v1_market_proto_rawDescOnce sync.Once + file_alt_v1_market_proto_rawDescData []byte +) + +func file_alt_v1_market_proto_rawDescGZIP() []byte { + file_alt_v1_market_proto_rawDescOnce.Do(func() { + file_alt_v1_market_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_alt_v1_market_proto_rawDesc), len(file_alt_v1_market_proto_rawDesc))) + }) + return file_alt_v1_market_proto_rawDescData +} + +var file_alt_v1_market_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_alt_v1_market_proto_goTypes = []any{ + (*Instrument)(nil), // 0: alt.v1.Instrument + (*Price)(nil), // 1: alt.v1.Price + (*Quantity)(nil), // 2: alt.v1.Quantity + (*Bar)(nil), // 3: alt.v1.Bar + (*ListInstrumentsRequest)(nil), // 4: alt.v1.ListInstrumentsRequest + (*ListInstrumentsResponse)(nil), // 5: alt.v1.ListInstrumentsResponse + (*ListBarsRequest)(nil), // 6: alt.v1.ListBarsRequest + (*ListBarsResponse)(nil), // 7: alt.v1.ListBarsResponse + nil, // 8: alt.v1.Instrument.ProviderSymbolsEntry + (Market)(0), // 9: alt.v1.Market + (Venue)(0), // 10: alt.v1.Venue + (Currency)(0), // 11: alt.v1.Currency + (*Decimal)(nil), // 12: alt.v1.Decimal + (Timeframe)(0), // 13: alt.v1.Timeframe +} +var file_alt_v1_market_proto_depIdxs = []int32{ + 9, // 0: alt.v1.Instrument.market:type_name -> alt.v1.Market + 10, // 1: alt.v1.Instrument.venue:type_name -> alt.v1.Venue + 11, // 2: alt.v1.Instrument.currency:type_name -> alt.v1.Currency + 8, // 3: alt.v1.Instrument.provider_symbols:type_name -> alt.v1.Instrument.ProviderSymbolsEntry + 11, // 4: alt.v1.Price.currency:type_name -> alt.v1.Currency + 12, // 5: alt.v1.Price.amount:type_name -> alt.v1.Decimal + 12, // 6: alt.v1.Quantity.amount:type_name -> alt.v1.Decimal + 13, // 7: alt.v1.Bar.timeframe:type_name -> alt.v1.Timeframe + 1, // 8: alt.v1.Bar.open:type_name -> alt.v1.Price + 1, // 9: alt.v1.Bar.high:type_name -> alt.v1.Price + 1, // 10: alt.v1.Bar.low:type_name -> alt.v1.Price + 1, // 11: alt.v1.Bar.close:type_name -> alt.v1.Price + 2, // 12: alt.v1.Bar.volume:type_name -> alt.v1.Quantity + 9, // 13: alt.v1.ListInstrumentsRequest.market:type_name -> alt.v1.Market + 0, // 14: alt.v1.ListInstrumentsResponse.instruments:type_name -> alt.v1.Instrument + 13, // 15: alt.v1.ListBarsRequest.timeframe:type_name -> alt.v1.Timeframe + 3, // 16: alt.v1.ListBarsResponse.bars:type_name -> alt.v1.Bar + 17, // [17:17] is the sub-list for method output_type + 17, // [17:17] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name +} + +func init() { file_alt_v1_market_proto_init() } +func file_alt_v1_market_proto_init() { + if File_alt_v1_market_proto != nil { + return + } + file_alt_v1_common_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_alt_v1_market_proto_rawDesc), len(file_alt_v1_market_proto_rawDesc)), + NumEnums: 0, + NumMessages: 9, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_alt_v1_market_proto_goTypes, + DependencyIndexes: file_alt_v1_market_proto_depIdxs, + MessageInfos: file_alt_v1_market_proto_msgTypes, + }.Build() + File_alt_v1_market_proto = out.File + file_alt_v1_market_proto_goTypes = nil + file_alt_v1_market_proto_depIdxs = nil +} diff --git a/packages/contracts/gen/go/go.mod b/packages/contracts/gen/go/go.mod new file mode 100644 index 0000000..59693b1 --- /dev/null +++ b/packages/contracts/gen/go/go.mod @@ -0,0 +1,5 @@ +module git.toki-labs.com/toki/alt/packages/contracts/gen/go + +go 1.22 + +require google.golang.org/protobuf v1.36.5 diff --git a/packages/contracts/gen/go/go.sum b/packages/contracts/gen/go/go.sum new file mode 100644 index 0000000..980e15b --- /dev/null +++ b/packages/contracts/gen/go/go.sum @@ -0,0 +1,6 @@ +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= diff --git a/packages/contracts/proto/alt/v1/backtest.proto b/packages/contracts/proto/alt/v1/backtest.proto index 81370d0..aed221e 100644 --- a/packages/contracts/proto/alt/v1/backtest.proto +++ b/packages/contracts/proto/alt/v1/backtest.proto @@ -53,3 +53,12 @@ message BacktestResult { Price starting_cash = 2; Price ending_equity = 3; } + +message GetBacktestResultRequest { + string run_id = 1; +} + +message GetBacktestResultResponse { + BacktestResult result = 1; +} + diff --git a/packages/contracts/proto/alt/v1/market.proto b/packages/contracts/proto/alt/v1/market.proto index 6f3dae9..2192049 100644 --- a/packages/contracts/proto/alt/v1/market.proto +++ b/packages/contracts/proto/alt/v1/market.proto @@ -44,3 +44,15 @@ message ListInstrumentsRequest { message ListInstrumentsResponse { repeated Instrument instruments = 1; } + +message ListBarsRequest { + string instrument_id = 1; + Timeframe timeframe = 2; + int64 from_unix_ms = 3; + int64 to_unix_ms = 4; +} + +message ListBarsResponse { + repeated Bar bars = 1; +} +