Some basic structures
This commit is contained in:
32
mmql/statements/actions/amount.go
Normal file
32
mmql/statements/actions/amount.go
Normal file
@@ -0,0 +1,32 @@
|
||||
package actions
|
||||
|
||||
import (
|
||||
// "fmt"
|
||||
engine "github.com/tgckpg/mmqlengine/mmql/engine"
|
||||
stmtd "github.com/tgckpg/mmqlengine/mmql/statements"
|
||||
)
|
||||
|
||||
/*
|
||||
EXPECT: [Number] [Units]
|
||||
OR
|
||||
EXPECT: [FUNCTION]( ...params )
|
||||
*/
|
||||
|
||||
func AmountStatement( lexer *engine.Lexer ) ( istmt stmtd.IStatement, err error ) {
|
||||
stmt := stmtd.AmountStatement{}
|
||||
|
||||
val, err := lexer.ReadDecimal()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
stmt.Value = val
|
||||
|
||||
unit, err := lexer.ReadAlpha()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
stmt.Unit = unit
|
||||
|
||||
istmt = stmt
|
||||
return
|
||||
}
|
41
mmql/statements/actions/buy.go
Normal file
41
mmql/statements/actions/buy.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package actions
|
||||
|
||||
import (
|
||||
engine "github.com/tgckpg/mmqlengine/mmql/engine"
|
||||
stmtd "github.com/tgckpg/mmqlengine/mmql/statements"
|
||||
)
|
||||
|
||||
/*
|
||||
EXPECT: BUY
|
||||
THEN EXPECT: [AmountStatement] OF [ProductStatement]
|
||||
THEN EXPECT: FOR [AmountStatement]
|
||||
THEN EXPECT: FROM [ExchangeType]
|
||||
THEN OPT EXPECT: [ExchangeType]
|
||||
THEN OPT EXPECT: [AND|OR]
|
||||
THEN EXPECT: [ActionExpression]
|
||||
THEN OPT EXPECT: FOR EVERY
|
||||
THEN EXPECT: [AmountType] OF [ProductType]
|
||||
THEN EXPECT: [SOLD|BOUGHT] FROM [ExchangeType]
|
||||
*/
|
||||
|
||||
func BuyStatement( lexer *engine.Lexer ) ( stmtd.IStatement, error ) {
|
||||
orderStmt := stmtd.OrderStatement{}
|
||||
orderStmt.Action = "BUY"
|
||||
|
||||
readAmount := engine.LexerExpect{
|
||||
Statements: true,
|
||||
Keywords: false,
|
||||
Brackets: false,
|
||||
Quotes: false,
|
||||
Key: "AMOUNT",
|
||||
}
|
||||
|
||||
amountStmt, err := lexer.ReadStatement( &readAmount )
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
orderStmt.For( amountStmt )
|
||||
|
||||
var istmt stmtd.IStatement = orderStmt
|
||||
return istmt, err
|
||||
}
|
30
mmql/statements/actions/buy_test.go
Normal file
30
mmql/statements/actions/buy_test.go
Normal file
@@ -0,0 +1,30 @@
|
||||
package actions
|
||||
|
||||
import (
|
||||
// "fmt"
|
||||
"testing"
|
||||
engine "github.com/tgckpg/mmqlengine/mmql/engine"
|
||||
stmtd "github.com/tgckpg/mmqlengine/mmql/statements"
|
||||
)
|
||||
|
||||
func TestBuyStatement( t *testing.T ) {
|
||||
lexer := engine.Lexer{}
|
||||
supportedStmts := map[string] func( *engine.Lexer ) ( stmtd.IStatement, error ) {
|
||||
"BUY": BuyStatement,
|
||||
"AMOUNT": AmountStatement,
|
||||
}
|
||||
lexer.SupportedStmts = &supportedStmts
|
||||
|
||||
_, err := lexer.Parse( `
|
||||
BUY 1 SHARES OF BTC_ETF
|
||||
FOR 10 USD
|
||||
FROM "MyBrokerAccount"
|
||||
WITH LIMIT OF PURCHASING_POWER( "MyBrokerAccount", "QQQ" )
|
||||
FOR EVERY
|
||||
1 BTC OF USD_BTC SOLD
|
||||
FROM "CoinBase"
|
||||
` )
|
||||
if err != nil {
|
||||
t.Error( err )
|
||||
}
|
||||
}
|
37
mmql/statements/types.go
Normal file
37
mmql/statements/types.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package statements
|
||||
|
||||
type IStatement interface { }
|
||||
|
||||
type RawStatement struct {
|
||||
IStatement
|
||||
Value string
|
||||
}
|
||||
|
||||
type QuotedValue struct {
|
||||
IStatement
|
||||
RawStatement *RawStatement
|
||||
Quote string
|
||||
}
|
||||
|
||||
type BracketedValue struct {
|
||||
IStatement
|
||||
RawStatement *RawStatement
|
||||
Brackets string
|
||||
}
|
||||
|
||||
type AmountStatement struct {
|
||||
IStatement
|
||||
Value float64
|
||||
Unit string
|
||||
}
|
||||
|
||||
type IActionStatement interface { }
|
||||
|
||||
type OrderStatement struct {
|
||||
IStatement
|
||||
IActionStatement
|
||||
Action string
|
||||
}
|
||||
|
||||
func ( this *OrderStatement ) For( stmt IStatement ) {
|
||||
}
|
Reference in New Issue
Block a user