Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var Cli = lua.TableMap{ "add_command": func(eng *lua.Engine) int { cmdTbl := eng.PopTable() if !cmdTbl.IsTable() { eng.PushValue(eng.False()) log("cli").Warn("{W}cli.add_command{x} was called without a table value") return 1 } run := cmdTbl.Get("run") if !run.IsFunction() { eng.PushValue(eng.False()) log("cli").Warn("No run command defined for the command.") return 1 } cmd := new(cobra.Command) cmd.Use = cmdTbl.Get("name").AsString() if cmd.Use == "" { eng.PushValue(eng.False()) log("cli").Warn("No name was provided for the command, a name is required.") return 1 } cmd.Short = cmdTbl.Get("summary").AsString() cmd.Long = cmdTbl.Get("description").AsString() cmd.Run = func(cmd *cobra.Command, args []string) { luaArgs := eng.TableFromSlice(args) flags := make(map[string]interface{}) cmd.Flags().VisitAll(func(f *pflag.Flag) { fval := reflect.ValueOf(f.Value) fval = reflect.Indirect(fval) fname := strings.ToLower(f.Name) flags[fname] = fval.Interface() }) luaFlags := eng.TableFromMap(flags) _, err := run.Call(0, luaArgs, luaFlags) if err != nil { logger.NewWithSource(fmt.Sprintf("cmd(%s)", cmd.Use)).WithError(err).Fatal("Failed to execute lua command") } } cmdFlags := cmdTbl.Get("flags") if !cmdFlags.IsNil() { for i := 1; i <= cmdFlags.Len(); i++ { finfo := cmdFlags.RawGet(i) name := finfo.Get("name").AsString() short := finfo.Get("short").AsString() typ := finfo.Get("type").AsString() desc := finfo.Get("description").AsString() def := finfo.Get("default").AsRaw() if name == "" || short == "" || typ == "" || desc == "" { log("cli").WithFields(logger.Fields{ "name": name, "short": short, "type": typ, "description": desc, }).Warn("name, short, type and description are required for flags to be defined") continue } switch typ { case "string": s, _ := def.(string) cmd.Flags().StringP(name, short, s, desc) case "boolean": bval, _ := def.(bool) cmd.Flags().BoolP(name, short, bval, desc) case "number": f64, _ := def.(float64) cmd.Flags().Float64P(name, short, f64, desc) case "duration": d, _ := def.(string) dur, err := time.ParseDuration(d) if err != nil { eng.RaiseError(err.Error()) return 0 } cmd.Flags().DurationP(name, short, dur, desc) default: log("cli").WithField("type", typ).Warn("Type value is not valid.") } } } rootCmd := eng.Meta[keys.RootCmd].(*cobra.Command) rootCmd.AddCommand(cmd) eng.PushValue(eng.True()) return 1 }, }
Cli is a module designed specifically for adding new commands to the dragon application.
commandInfo: table = { name: string = name used to call the command summary: string? = short description of the subcommand description: string? = long description of the subcommand run: function = function to run if the command is called flags: table? { { type: string = "number" | "string" | "boolean" name: string = name of the flag, if it's "thing" the flag is "--thing" short: string = short description of the flag description: string = long description of the flag default: string | number | boolean | string(duration) = default value of the flag } } } add_command(cmd_info): boolean @param cmd_info: commandInfo = the information necessary to build out a new command for the command line interface. add a subcommand based on the information provided. Allowing any plguin to add their own commands.
var Config = lua.TableMap{ "get": func(eng *lua.Engine) int { key := eng.PopString() iface := viper.Get(key) t := reflect.TypeOf(iface) switch t.Kind() { case reflect.Map: eng.PushValue(eng.TableFromMap(iface)) case reflect.Slice: eng.PushValue(eng.TableFromSlice(iface)) default: eng.PushValue(iface) } return 1 }, }
Config provides a way for scripts to access data defined inside the Dragonfile.toml.
get(key): any @param key: string = the dot notation key to look up in the application configuration fetches a configuration value for the application by key
var Die = lua.TableMap{ "d2": random.D2, "d4": random.D4, "d6": random.D6, "d8": random.D8, "d10": random.D10, "d12": random.D12, "d20": random.D20, "d100": random.D100, "roll": func(e *lua.Engine) int { str := e.PopString() rolls := random.RollDie(str) e.PushValue(e.TableFromSlice(rolls)) return 1 }, }
Die is a module mapping that provides simulated die rolling methods to the the scripting engine.
d2(): number simulate rolling 1d2 d4(): number simulate rolling 1d4 d6(): number simulate rolling 1d6 d8(): number simulate rolling 1d8 d10(): number simulate rolling 1d10 d12(): number simulate rolling 1d12 d20(): number simulate rolling 1d20 d100(): number simulate rolling 1d100 roll(die): table @param die: string = the string defining how many of what to roll parse die input and roll the specified number of sided die, for example die.roll("3d8") will simulate rolling 3 8-sided die, and return the values as a table.
var Events = lua.TableMap{ "Halt": events.ErrHalt, "emit": func(engine *lua.Engine) int { dataVal := engine.Nil() if engine.StackSize() >= 2 { dataVal = engine.PopValue() } evt := engine.PopValue().AsString() var data events.Data if dataVal.IsTable() { data = events.Data(dataVal.AsMapStringInterface()) } go emitEvent(engine, evt, data) return 0 }, "emit_once": func(engine *lua.Engine) int { dataVal := engine.Nil() if engine.StackSize() >= 2 { dataVal = engine.PopValue() } evt := engine.PopValue().AsString() var data events.Data if dataVal.IsTable() { data = events.Data(dataVal.AsMapStringInterface()) } go emitOnceEvent(engine, evt, data) return 0 }, "on": func(engine *lua.Engine) int { fn := engine.PopValue() evt := engine.PopValue().AsString() if evt != "" { bindEvent(engine, fn, evt) } return 0 }, "once": func(engine *lua.Engine) int { fn := engine.PopValue() evt := engine.PopValue().AsString() if evt != "" { bindOnceEvent(engine, fn, evt) } return 0 }, }
Events is a module for emitting and receiving events in Lua.
Halt: (go error) used to halt event exuction, bypassing failure logs emit(event[, data]) @param event: string = the event string value to be emitted to @param data: table = a table of initial event properties to seed the event emission. emits the given event with the data, which can be nil or omitted emit_once(event[, data]) @param event: string = the event string value to be emitted to @param data: table = a table of initial event properties to seed the event emission. emits the event, similar to #emit, but any future binding to the given event will automatically be fired as this event has already been emitted, this is perfect for initializiation or one time load notices on(event, handler) @param event: string = the event to associate the given handler to. @param handler: function = a function to execute if the event specified is emitted. registers the given function to handle the given event once(event, handler: function) @param event: string = the event to associate the given handler to. @param handler: function = a function to execute if the event specified is emitted. registers the given function to handle the given event only one time
var Log = lua.TableMap{ "error": func(eng *lua.Engine) int { performLog(eng, func(l logger.Log, msg string) { l.Error(msg) }) return 0 }, "warn": func(eng *lua.Engine) int { performLog(eng, func(l logger.Log, msg string) { l.Warn(msg) }) return 0 }, "info": func(eng *lua.Engine) int { performLog(eng, func(l logger.Log, msg string) { l.Info(msg) }) return 0 }, "debug": func(eng *lua.Engine) int { performLog(eng, func(l logger.Log, msg string) { l.Debug(msg) }) return 0 }, }
Log is the definition of the Lua logging module.
error(msg[, data]) @param msg: string = the message to log according the log configuraiton provided for the application @param data: table = associated data to log with the message, if any additional data is required. log message with data on the error level, data can be omitted or nil warn(msg[, data]) @param msg: string = the message to log according the log configuraiton provided for the application @param data: table = associated data to log with the message, if any additional data is required. log message with data on the warn level, data can be omitted or nil info(msg[, data]) @param msg: string = the message to log according the log configuraiton provided for the application @param data: table = associated data to log with the message, if any additional data is required. log message with data on the info level, data can be omitted or nil debug(msg[, data]) @param msg: string = the message to log according the log configuraiton provided for the application @param data: table = associated data to log with the message, if any additional data is required. log message with data on the debug level, data can be omitted or nil
var Password = lua.TableMap{ "hash": func(engine *lua.Engine) int { passwordArg := engine.PopValue() if !passwordArg.IsString() { engine.PushValue(nil) return 1 } password := passwordArg.AsString() cost := getBcryptCost() res, err := bcrypt.GenerateFromPassword([]byte(password), cost) if err != nil { engine.PushValue(nil) return 1 } engine.PushValue(string(res)) return 1 }, "is_valid": func(engine *lua.Engine) int { if engine.StackSize() < 2 { engine.PushValue(false) return 1 } hashedArg := engine.PopValue() passwordArg := engine.PopValue() if !hashedArg.IsString() || !passwordArg.IsString() { engine.PushValue(false) return 1 } hashed := hashedArg.AsString() password := passwordArg.AsString() err := bcrypt.CompareHashAndPassword([]byte(hashed), []byte(password)) engine.PushValue(err == nil) return 1 }, }
Password provides a method to take options to hash a password using the argon2i encryption algorithm.
hash(password): string @param password: string = a plaintext password value hashes the plain text password using the bcrypt algorithm for hasing passwords and the configured cost in Dragonfile.toml. isValid(password: string, hash: string): string @param password string = the plain text password entered by the user that will be compared against the hash @param hash: string = a hash of an encrypted password that the new password should match after encryption hashes the given password and compares it to the hashed password (using the same cost that the hashed password was generated with) and compares the result.
Random provides a means for generating random numbers up to a maximum value or between a minimum and a maximum.
gen(max): number @param max: number = the maximum value to generated a number to generate a number from 0 up to the max value given. range(min: number, max: number): number @param min: number = the lower bound (inclusive) of generated random numbers @param max: number = the upper bound (exclusive) of generated random numbers generate a number between the given minimum and maximum, the range [min, max)
var Sutil = lua.TableMap{ "split": func(eng *lua.Engine) int { sep := eng.PopString() str := eng.PopString() strs := strings.Split(str, sep) list := eng.NewTable() for _, str := range strs { list.Append(str) } eng.PushValue(list) return 1 }, "join": func(eng *lua.Engine) int { joiner := eng.PopString() words := eng.PopTable() var strs []string words.ForEach(func(_ *lua.Value, value *lua.Value) { strs = append(strs, value.AsString()) }) eng.PushValue(strings.Join(strs, joiner)) return 1 }, "test_rx": func(eng *lua.Engine) int { haystack := eng.PopString() needle := eng.PopString() rx, err := fetchRx(needle) if err != nil { eng.PushValue(eng.False()) return 1 } res := rx.MatchString(haystack) eng.PushValue(res) return 1 }, "starts_with": func(eng *lua.Engine) int { prefix := eng.PopString() str := eng.PopString() eng.PushValue(strings.HasPrefix(str, prefix)) return 1 }, "ends_with": func(eng *lua.Engine) int { suffix := eng.PopString() str := eng.PopString() eng.PushValue(strings.HasSuffix(str, suffix)) return 1 }, "contains": func(eng *lua.Engine) int { needle := eng.PopString() haystack := eng.PopString() eng.PushValue(strings.Contains(haystack, needle)) return 1 }, "matches": func(eng *lua.Engine) int { haystack := eng.PopString() needle := eng.PopString() rx, err := fetchRx(needle) if err != nil { eng.PushValue(eng.NewTable()) return 1 } res := rx.FindAllString(haystack, -1) eng.PushValue(eng.TableFromSlice(res)) return 1 }, "inspect_value": func(eng *lua.Engine) int { val := eng.PopValue() eng.PushValue(val.Inspect("")) return 1 }, }
Sutil contains several features that Lua string handling lacks, things like joining and regex matching and splitting and trimming and various other things.
split(input, separator): table @param input: string = the string to perform the split operation on @param separator: string = the separator with which to split the string by split the input string in parts based on matching the separator string join(words, joiner): string @param words: table = list of values that should be joined together @param joiner: string = a string value that should act as the glue between all values in (words) from ealier. combine the input list of strings with the joiner test_rx(needle, haystack): boolean @param needle: pattern = A Go regular expressoin pattern used to test against the given string value? @param haystack: string = the body to perform the search within test the haystack against the needle (regular expression search) starts_with(str, prefix): boolean @param str: string = the value to test against the prefix @param prefix: string = the prefix that is in question determines if the string starts with the given substring ends_with(str, suffix): boolean @param str: string = the value to test against the suffix @param suffix: string = the suffix that is in question determines if the string ends with the given substring contains(haystack, needle): boolean @param haystack: string = the body of data to be searched by the pattern. @param needle: string = the pattern (regular expression) to search for within the text. determines if substring is present in the given string matches(needle, haystack): table @param needle: string = the pattern (regular expression) to compare against the haystack @param haystack: string = the body of data to be compared against the pattern a list of strings that match the needle (regexp)
var Talon = lua.TableMap{ "exec": func(engine *lua.Engine) int { query, err := getTalonQuery(engine) if err != nil { engine.RaiseError(err.Error()) return 0 } result, err := query.Exec() if err != nil { engine.RaiseError(err.Error()) return 0 } engine.PushValue(result) return 1 }, "query": func(engine *lua.Engine) int { query, err := getTalonQuery(engine) if err != nil { engine.RaiseError(err.Error()) return 0 } rows, err := query.Query() if err != nil { engine.RaiseError(err.Error()) return 0 } engine.PushValue(talonToLua(engine, rows)) return 1 }, }
Talon is the core database Lua wrapper, giving the coder access to running queries against the database
exec(cypher, properties): talon.Result @param cypher: string - the cypher query to execute on the database server @param properties: table - properties to fill the cypher query with before execution @errors raises an error if there is an issue with the database connection or the query construction executes a query on the database and returns a result value, this should be used with queries that don't return a result set (like creating, editing and deleting). query(cypher, properties): talon.Rows @param cypher: string - the cypher query to execute on the database server @param properties: table - properties to fill the cypher query with before execution @errors raises an error if there is an issue with the database connection or the query construction executes a query on the database server and returns a set of rows with the queries results. talon.Rows next(): talon.Row the rowset is a lazy loaded series of rows, next will return the next row in the set of rows returned by the query. If there are no more rows this will return nil. close() close the set of rows, this is a _very_ good thing to do to clean up after your queries. It is undefined behavior to fail to close your row sets. inspect(): string return a debug view into the talon.Rows value. talon.Row get(key): any @param key: string | number - the field name in the row or the field index in the result. this will return any value associated with the index or field name or nil if no value is found. talon.Node @property id: number - numeric auto id number assigned to the node by the database @property labels: table - a list of labels associated with the node; not quite a table, it's a Go slice but functions similarly @property properties: table - a key/vale paring of properties associated with the node; not quite a table, a Go map but functions like a table. get(key): any @param key: string - the name of the property to fetch from the node, mostly a shorthand for accessing properties fetch a property by key from the node. talon.Relationship @property id: number - numeric auto id number assigned to the node by the database @property start_node_id: number - the auto identifier of the node that this relationship originates from @property end_node_id: number - the auto identifier of the node that this relationship executes at @property name: string - the label of the label (or name) @property properties: table - a key/vale paring of properties associated with the node; not quite a table, a Go map but functions like a table. @property bounded: boolean - denotes whether start_node_id and end_node_id will be set. If a relationship is bounded then it's start and end points are recorded, if it's not bounded they will not be set (most likely returning 0). get(key): any @param key: string - the name of the property to fetch from the relationship, mostly a shorthand for accessing properties fetch a property by key from the relationship. talon.Path functionally a table (list) of alternating node/relationship values from one node to another.
var Time = lua.TableMap{ "now": func() *instantValue { t := instantValue(time.Now().UTC()) return &t }, "parse": func(fmt, date string) *instantValue { t, err := time.Parse(fmt, date) if err != nil { return nil } iv := instantValue(t) return &iv }, "create": func(engine *lua.Engine) int { if engine.StackSize() < 1 { engine.RaiseError("a map of date information is required") return 0 } arg := engine.PopValue() m := arg.AsMapStringInterface() iv, err := instantFromMap(m) if err != nil { engine.RaiseError(err.Error()) return 0 } engine.PushValue(iv) return 1 }, "unix": func(ts int64) *instantValue { t := time.Unix(ts, 0).UTC() iv := instantValue(t) return &iv }, "duration": func(eng *lua.Engine) int { if eng.StackSize() == 0 { eng.ArgumentError(1, "expected an argument, but received none") return 0 } val := eng.PopValue() var dur float64 switch { case val.IsNumber(): dur = val.AsNumber() case val.IsTable(): dur = durationFromMap(val.AsMapStringInterface()) case val.IsString(): dur = durationFromString(val.AsString()) } eng.PushValue(float64(floatToDuration(dur))) return 1 }, "duration_parts": func(f float64) map[string]float64 { if f > math.MaxInt64 || f < math.MinInt64 { return map[string]float64{ "out_of_range": f, } } dur := floatToDuration(f) durMap := make(map[string]float64) year := durationMap["year"] temp := dur / year dur %= year durMap["years"] = float64(temp) month := durationMap["month"] temp = dur / month dur %= month durMap["months"] = float64(temp) week := durationMap["week"] temp = dur / week dur %= week durMap["weeks"] = float64(temp) day := durationMap["day"] temp = dur / day dur %= day durMap["days"] = float64(temp) temp = dur / time.Hour dur %= time.Hour durMap["hours"] = float64(temp) temp = dur / time.Minute dur %= time.Minute durMap["minutes"] = float64(temp) temp = dur / time.Second dur %= time.Second durMap["seconds"] = float64(temp) temp = dur / time.Millisecond dur %= time.Millisecond durMap["milliseconds"] = float64(temp) durMap["nanoseconds"] = float64(dur) return durMap }, }
Time provides some basic time functions for creating a time in Lua.
instantData: table = { year: number = the year the instant is set in; default: current year, month: string | number = the three letter name, full name or numeric represenation of the month: "jan", "January", 1; default: January day: number = the day in which the instant is to be set; default: 1, hour: number = the hour (0-23) of the instant; default: 0, min: number = the minute (0-59) of the instant; default: 0, minute: number = alias for min sec: number = the second (0-59) of the instant; default: 0, second: number = alias for sec milli: number = the number of milliseconds (past the second) of the instant; defualt 0 millisecond: number = alias for milli nano: number = the number of nanoseconds (past the second) of the instant; default: 0, nanosecond: number = alias for nano zone: string = the name of the time zone for the instant in anything other than "UTC"; default: UTC } durationData: table = { nanosecond: number = number of nanoseconds in this duration, millisecond: number = number of milliseconds in this duration, second: number = number of seconds in this duration, minute: number = number of minutes in this duration, hour: number = number of hours in this duration, day: number = number of days in this duration (assumed 24 hours), week: number = number of weeks in this duration (assumed 7 days), month: number = number of months in this duration (assumed 30 days), year: number = number of years in this duration (assumed 365 days) } now(): time.Instant returns an instant value representing the current time in the UTC time time zone. parse(format, date): time.Instant | nil @param format: string = the format to be used to parse the given date date string with. This format is based on the same format that Go's time package uses, 'Mon Jan 2 15:04:05 -0700 MST 2006', you can use a wide variety of this date to specify the format. @param date: string = the stringified date value that is to be parsed with the given format. attempts to parse the date value with the given format and returns an instant value based on the given date string value -- if the date fails to parse then nil will be returned. create(data): time.Instant @param data: instantData = a table containing the values to construct the instant value from. All keys are optional. builds an instant with any given information using default fallbacks and returns this new instant. unix(timestamp): time.Instant @param timestamp: number = a Unix timestamp value used to generate an instant value for the given date based on the rules of unix timestamps. this method generates a time.Instant value based on the give timestamp. duration(generator): number @param generator: table(durationData) | number | string = either a table defining the values in the duration, a string encoding of the duration or a numeric value that is the duration. this method generates a duration value, it's range is roughly -290..290 years. forcing beyond this boundary is undefined and should be avoided at all costs. duration_parts(duration): table @param duration: number = the number of nanoseconds representing a period an arbitrary passing of time with no start point take a duration value and break it into a map containing the named components, like a duration of "1w" would come back with {weeks = 1}. given the nature of durations being numbers, if a generated duration has overlapping periods you can expect to get different components back, for example "8d" (8 days) = {weeks = 1, days = 1} time.Instant format(format): string @param format: string = the format that will be used to produce a string representation formats the date according to the string value. Like time.parse this method uses the Go base date 'Mon Jan 2 15:04:05 -0700 MST 2006' as a means for defining the format unix(): number returns the unix timestamp value for the given instant in time. in_zone(zone): time.Instant @param zone: string = the name of the time zone to transition this instant to. this will create a new instant and return that value in the given time zome. zone(): string return the name of the time zone (not 100% accurate) used for the instant's current time zone. It's not super accurate becuase if you use 'local' you get 'local' back. add(duration): time.Instant @param duration: number = the number of nanonseconds that need to be to the current instant. add a fixed duration to the given date and return the results as a new date value. sub(duration): time.Instant @param duration: number = the number of nanonseconds that need to be to the current instant. much the same as :add, however this method will negate the duration. sub_date(oinstant): number @param oinstant: time.Instant = the instant you wish to subtract from the current instant. returns the duration, or nanosecond difference, between the original instant and the instant you're subtracting from. is_before(oinstant): boolean @param oinstant: time.Instant = the other instant you're comparing this instant too. returns true if the current instant occurred _before_ the other instant. is_after(oinstant): boolean @param oinstant: time.Instant = the other instant you're comparing this instant too. the opposite of :is_before, this checks to see if this instant occurred _after_ the other. inspect(): string returns a string that represents a debug output, primarily for use in the REPL.
var Tmpl = lua.TableMap{ "register": func(name, contents string) bool { err := tmpl.Register(name, contents) if err != nil { fields := logger.Fields{ "error": err.Error(), } if len(contents) < 255 { fields["template"] = contents } log("tmpl").WithFields(fields).Error("Register failed from script with error") } return err == nil }, "render": func(engine *lua.Engine) int { data := engine.PopTable().AsMapStringInterface() name := engine.PopString() log := log("tmpl").WithField("tmpl_name", name) t, err := tmpl.Template(name) if err != nil { log.WithError(err).Error("Failed to fetch template name.") engine.RaiseError(err.Error()) return 0 } result, err := t.Render(data) if err != nil { log.WithFields(logger.Fields{ "error": err.Error(), "data": data, }).Error("Failed to render template from requested in script.") } engine.PushValue(result) return 1 }, "render_in_layout": func(eng *lua.Engine) int { ldata := eng.PopValue() children := eng.PopValue() parent := eng.PopString() pt, err := tmpl.Template(parent) if err != nil { log("tmpl").WithError(err).WithField("template", parent).Warn("Parent template requested but undefined, returning empty string.") eng.PushValue("") return 1 } var data map[string]interface{} if ldata.IsTable() { data = ldata.AsMapStringInterface() } else { data = make(map[string]interface{}) } switch { case children.IsString(): cs := children.AsString() r, err := tmpl.Template(cs) if err != nil { log("tmpl").WithError(err).WithField("tempalte", cs).Warn("Template requested, but doesn't exit. Using empty string.") data["content"] = "" } else { data["content"], err = r.Render(data) if err != nil { log("tmpl").WithError(err).WithField("template", cs).Error("Failed to render template") data["content"] = "" } } case children.IsTable(): children.ForEach(func(key, val *lua.Value) { if key.IsString() { ks := key.AsString() if val.IsString() { vs := val.AsString() r, err := tmpl.Template(vs) if err != nil { log("tmpl").WithError(err).WithField("tempalte", vs).Warn("Template requested, but doesn't exit. Using empty string.") data[ks] = "" return } data[ks], err = r.Render(data) if err != nil { log("tmpl").WithError(err).WithField("template", ks).Error("Failed to render template.") data[ks] = "" } } else { log("tmpl").WithFields(logger.Fields{ "template": ks, "type": val.String(), }).Warn("Non-string value given as name of template, using empty string.") data[ks] = "" } } else { log("tmpl").WithField("type", key.String()).Warn("Non-string key provided as key of rendered template, ignoring") } }) } res, err := pt.Render(data) if err != nil { log("tmpl").WithError(err).WithField("template", pt).Error("Failed to render parent template, returning empty string.") eng.PushValue("") return 1 } eng.PushValue(res) return 1 }, }
Tmpl is the templating module accessible in scripts. This module consists of two accessible methods:
register(name, body) @param name: string = the name to associate with this template after @param body: string = the uncompiled body of the template registration register a template with the given name render(name, data) @param name: string = the name of the compiled template to use for generating output @param data: table = a table of data to provide to the rendering of the named templates render the template with the given name using the given data to populate it render_in_layout(layout, children, data) @param layout: string = the name of the layout template to render. @param children: string or table = the children to render in the layout. if provided as a string, then the name to use in the layout is 'content', otherise this is table of field names -> template names to use in generating layout content. @param data: table = a table of data to provide to the rendering of the named templates (used for all views, so must be merged) render the child templates with the provided and building an additional set of data containing the rendered children before rendering the final layout template which can position the child templates via normal rendering means.
var UUID = lua.TableMap{ "new": func() string { u := uuid.NewV1() return u.String() }, }
UUID enables the generation of UUID v1 values, as necessary.
new(): string a new v1 UUID value in string format.
Functions ¶
func ScriptLoader ¶
func TalonLoader ¶
TalonLoader will create the meta tables for talon.Row and talon.Rows for this Engine.
Types ¶
This section is empty.