1
0
mirror of https://github.com/aclindsa/moneygo.git synced 2024-11-16 19:40:05 -05:00
moneygo/internal/reports/prices.go
Aaron Lindsay a357d38eee Store currency/security values/prices using big.Rat natively
This adds 'shadow' types used only by the store/db internal package whch
handle converting these types to their DB-equivalent values. This change
should allow reports to be generated significantly faster since it
allows a large portion of the computation to be shifted to the database
engines.
2017-12-12 19:50:38 -05:00

89 lines
2.2 KiB
Go

package reports
import (
"github.com/aclindsa/moneygo/internal/models"
"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 *models.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) *models.Price {
ud := L.CheckUserData(n)
if price, ok := ud.Value.(*models.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":
float, _ := p.Value.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.String() + " " + c.Symbol + " (" + s.Symbol + ")"))
return 1
}