1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#!/usr/bin/env bash
# QA stub interpreter: emulates the akshare_collector.py JSON contract
# (source=stub-synthetic, _synthetic=true on every payload).
# Invoked by MarketDataService as: fund-lab-python <script> --operation search --query X | --operation nav --code X
set -euo pipefail
OP=""
QUERY=""
CODE=""
args=("$@")
for ((i=1; i<${#args[@]}; i++)); do
case "${args[$i]}" in
--operation) OP="${args[$((i+1))]:-}"; i=$((i+1)) ;;
--query) QUERY="${args[$((i+1))]:-}"; i=$((i+1)) ;;
--code) CODE="${args[$((i+1))]:-}"; i=$((i+1)) ;;
esac
done
TS="$(date -u +%Y-%m-%dT%H:%M:%S+00:00)"
case "$OP" in
search)
printf '{"schema_version":"fund-lab.akshare.v1","operation":"search","source":"stub-synthetic","source_revision":"stub-1","_synthetic":true,"collected_at":"%s","instruments":[{"code":"000001","name":"桩测试基金一号","fund_type":"混合型"},{"code":"110011","name":"桩测试基金二号","fund_type":null}]}\n' "$TS"
;;
nav)
printf '{"schema_version":"fund-lab.akshare.v1","operation":"nav","source":"stub-synthetic","source_revision":"stub-1","_synthetic":true,"collected_at":"%s","instrument":{"code":"%s"},"observations":[{"nav_date":"2026-09-15","published_at":null,"nav":"1.1000","accumulated_nav":null,"daily_return":null},{"nav_date":"2026-09-16","published_at":null,"nav":"1.1205","accumulated_nav":null,"daily_return":"1.86"},{"nav_date":"2026-09-17","published_at":null,"nav":"1.1180","accumulated_nav":null,"daily_return":"-0.22"},{"nav_date":"2026-09-18","published_at":null,"nav":"1.1500","accumulated_nav":null,"daily_return":"2.86"},{"nav_date":"2026-09-21","published_at":null,"nav":"1.1902","accumulated_nav":null,"daily_return":"3.49"}]}\n' "$TS" "$CODE"
;;
*)
echo "unknown operation: $OP" >&2
exit 2
;;
esac
|