1
0
mirror of https://github.com/aclindsa/moneygo.git synced 2024-12-26 15:42:27 -05:00
moneygo/prices_lua.go
Aaron Lindsay f213e1061c Add security prices
* Import them from Gnucash's pricedb
* Add support for querying prices from lua for reports
* Add documentation for lua reports
2017-07-13 21:32:25 -04:00

92 lines
2.2 KiB
Go

package main
import (
"github.com/yuin/gopher-lua"
)
const luaPriceTypeName = "price"
func luaRegisterPrices(L *lua.LState) {
mt := L.NewTypeMetatable(luaPriceTypeName)
L.SetGlobal("price", mt)
L.SetField(mt, "__index", L.NewFunction(luaPrice__index))
L.SetField(mt, "__tostring", L.NewFunction(luaPrice__tostring))
L.SetField(mt, "__metatable", lua.LString("protected"))
}
func PriceToLua(L *lua.LState, price *Price) *lua.LUserData {
ud := L.NewUserData()
ud.Value = price
L.SetMetatable(ud, L.GetTypeMetatable(luaPriceTypeName))
return ud
}
// Checks whether the first lua argument is a *LUserData with *Price and returns this *Price.
func luaCheckPrice(L *lua.LState, n int) *Price {
ud := L.CheckUserData(n)
if price, ok := ud.Value.(*Price); ok {
return price
}
L.ArgError(n, "price expected")
return nil
}
func luaPrice__index(L *lua.LState) int {
p := luaCheckPrice(L, 1)
field := L.CheckString(2)
switch field {
case "PriceId", "priceid":
L.Push(lua.LNumber(float64(p.PriceId)))
case "Security", "security":
security_map, err := luaContextGetSecurities(L)
if err != nil {
panic("luaContextGetSecurities couldn't fetch securities")
}
s, ok := security_map[p.SecurityId]
if !ok {
panic("Price's security not found for user")
}
L.Push(SecurityToLua(L, s))
case "Currency", "currency":
security_map, err := luaContextGetSecurities(L)
if err != nil {
panic("luaContextGetSecurities couldn't fetch securities")
}
c, ok := security_map[p.CurrencyId]
if !ok {
panic("Price's currency not found for user")
}
L.Push(SecurityToLua(L, c))
case "Value", "value":
amt, err := GetBigAmount(p.Value)
if err != nil {
panic(err)
}
float, _ := amt.Float64()
L.Push(lua.LNumber(float))
default:
L.ArgError(2, "unexpected price attribute: "+field)
}
return 1
}
func luaPrice__tostring(L *lua.LState) int {
p := luaCheckPrice(L, 1)
security_map, err := luaContextGetSecurities(L)
if err != nil {
panic("luaContextGetSecurities couldn't fetch securities")
}
s, ok1 := security_map[p.SecurityId]
c, ok2 := security_map[p.CurrencyId]
if !ok1 || !ok2 {
panic("Price's currency or security not found for user")
}
L.Push(lua.LString(p.Value + " " + c.Symbol + " (" + s.Symbol + ")"))
return 1
}