ek-data 0.2.7

Trading data contracts for the enkeep ek ecosystem: venue enums, zero-dep epoch-nanosecond time, decimal-exact price rounding, vt-symbol convention, bus event dictionary, tick/bar/order/trade/position/account/contract objects and request objects (Python enkeep_trade trader/object.py + constant.py, faithfully ported).
Documentation
<#
  One-command quality gate for ek-data (ticket T4, 2026-10-27).

  Runs (in order):
    1. cargo fmt --check                          (0 output expected)
    2. cargo test                                 (all test targets)
    3. cargo clippy --all-targets -- -D warnings
    4. cargo doc --no-deps

  Usage:
    powershell -ExecutionPolicy Bypass -File scripts/gate.ps1

  Exit code: 0 = all gates passed, 1 = at least one gate failed.

  Note: formatting results are bound to the rustfmt version; the repo baseline is
  rustfmt 1.8.0-stable with rustc 1.94.0 (both printed below). A different rustfmt
  may report a false failure.

  NOTE: ASCII-only on purpose (Windows PowerShell 5.1 decodes BOM-less .ps1 as ANSI).
#>
[CmdletBinding()]
param()

# 'Continue' on purpose: cargo/clippy write progress to stderr, which PowerShell
# would otherwise surface as terminating errors when the preference is 'Stop'.
$ErrorActionPreference = 'Continue'

$root = Split-Path -Parent $PSScriptRoot
Push-Location $root
try {
    Write-Host "toolchain:" -ForegroundColor Cyan
    & rustfmt --version
    & rustc --version
    & cargo --version

    $results = New-Object System.Collections.ArrayList

    function Invoke-Gate {
        param([string]$Name, [scriptblock]$Body)
        Write-Host ""
        Write-Host ("=== " + $Name + " ===") -ForegroundColor Cyan
        & $Body
        $code = $LASTEXITCODE
        if ($null -eq $code) { $code = 0 }
        if ($code -eq 0) {
            Write-Host ("PASS  " + $Name) -ForegroundColor Green
            [void]$results.Add([pscustomobject]@{ Name = $Name; Ok = $true })
        } else {
            Write-Host ("FAIL  " + $Name + "  (exit " + $code + ")") -ForegroundColor Red
            [void]$results.Add([pscustomobject]@{ Name = $Name; Ok = $false })
        }
    }

    Invoke-Gate 'cargo fmt --check' { cargo fmt --check }
    Invoke-Gate 'cargo test' { cargo test }
    Invoke-Gate 'cargo clippy --all-targets -- -D warnings' { cargo clippy --all-targets -- -D warnings }
    Invoke-Gate 'cargo doc --no-deps' { cargo doc --no-deps }

    Write-Host ""
    Write-Host "===== gate summary =====" -ForegroundColor Cyan
    $failed = 0
    foreach ($r in $results) {
        if ($r.Ok) {
            Write-Host ("  PASS  " + $r.Name) -ForegroundColor Green
        } else {
            Write-Host ("  FAIL  " + $r.Name) -ForegroundColor Red
            $failed++
        }
    }

    if ($failed -eq 0) {
        Write-Host "ALL GATES PASSED" -ForegroundColor Green
        exit 0
    } else {
        Write-Host ("GATES FAILED: " + $failed) -ForegroundColor Red
        exit 1
    }
} finally {
    Pop-Location
}

# ── 数据契约禁止 `..*Data::default()` 兜底(2026-11-01)─────────────────
# 老写法让 `ek-data` 新增字段时静默变默认值、编译器一声不响
# (`traded_price` 就这么躺了好几轮才被审计发现)。
# 只查 src/:**examples 与 tests 里构造最小测试对象是正常写法**,不算违规。
$fallbacks = Get-ChildItem -Recurse -Filter *.rs -Path src | Select-String -Pattern '^\s*\.\.\w*Data::default\(\)'
if ($fallbacks) {
    Write-Host "[gate] FAIL 数据契约出现兜底构造:" -ForegroundColor Red
    $fallbacks | ForEach-Object { Write-Host ("  {0}:{1}  {2}" -f (Split-Path $_.Path -Leaf), $_.LineNumber, $_.Line.Trim()) }
    throw "数据契约禁止 ..*Data::default();请显式写全字段"
}
Write-Host "[gate] OK 数据契约无兜底构造" -ForegroundColor Green