-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathqueries.go
138 lines (117 loc) · 4.32 KB
/
queries.go
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package gomoex
import (
"fmt"
"strconv"
"strings"
"github.com/tidwall/gjson"
)
const (
_issURL = `https://iss.moex.com/iss`
_history = `/history`
_engines = `/engines/`
_markets = `/markets/`
_boards = `/boards/`
_securities = `/securities/`
_object = `/`
_query = `.json?iss.json=extended&iss.meta=off&iss.only=history.cursor,`
_from = `&from=`
_till = `&till=`
_interval = `&interval=`
_start = `&start=%d`
)
// converter преобразует строку таблицы из json.
type converter func(row gjson.Result) (interface{}, error)
// issQuery содержит данные необходимые для осуществления запроса.
type issQuery struct {
fmt string
table string
multipart bool
rowConverter converter
start int
err error
}
func (query issQuery) URL() string {
return fmt.Sprintf(query.fmt, query.start)
}
// querySettings содержит настройки создания запроса к ISS.
//
// Позволяет сформировать необходимый для его осуществления URL и вспомогательные данные.
//
// Официальный справочник запросов https://iss.moex.com/iss/reference/
// Официальный справочник разработчика https://fs.moex.com/files/6523
type querySettings struct {
// Нужен ли префикс history.
history bool
// Значение плейсхолдера engine. Для пустой строки не добавляется в запрос.
engine string
// Значение плейсхолдера market. Для пустой строки не добавляется в запрос.
market string
// Значение плейсхолдера board. Для пустой строки не добавляется в запрос.
board string
// Значение плейсхолдера security. Для пустой строки не добавляется в запрос.
security string
// Запрашиваемый объект. Для пустой строки не добавляется в запрос.
object string
// Запрашиваемая таблица внутри ответа.
table string
// Дата, с которой выводить данные в формате ГГГГ-ММ-ДД.
from string
// Дата, до которой выводить данные в формате ГГГГ-ММ-ДД.
till string
// Интервал свечек.
interval int
// Будет ли ответ разбит на несколько блоков, требующих последовательной загрузки со смещением стартовой позиции.
multipart bool
// Конвертор данных — выбирает необходимые поля и преобразует данные.
rowConverter converter
}
// Make формирует URL запроса на основании описания для заданной стартовой позиции.
// В базовый URL добавляются требование предоставить расширенный JSON без метаданных с таблицей курсора.
func (query *querySettings) Make() issQuery {
var url strings.Builder
url.WriteString(_issURL)
if query.history {
url.WriteString(_history)
}
if query.engine != "" {
url.WriteString(_engines)
url.WriteString(query.engine)
}
if query.market != "" {
url.WriteString(_markets)
url.WriteString(query.market)
}
if query.board != "" {
url.WriteString(_boards)
url.WriteString(query.board)
}
if query.security != "" {
url.WriteString(_securities)
url.WriteString(query.security)
}
if query.object != "" {
url.WriteString(_object)
url.WriteString(query.object)
}
url.WriteString(_query)
url.WriteString(query.table)
if query.from != "" {
url.WriteString(_from)
url.WriteString(query.from)
}
if query.till != "" {
url.WriteString(_till)
url.WriteString(query.till)
}
if query.interval != 0 {
url.WriteString(_interval)
url.WriteString(strconv.Itoa(query.interval))
}
url.WriteString(_start)
return issQuery{
fmt: url.String(),
table: query.table,
multipart: query.multipart,
rowConverter: query.rowConverter,
}
}