UNPKG

lua-types

Version:

TypeScript definitions for Lua standard library

267 lines (243 loc) 10.9 kB
// Based on https://www.lua.org/manual/5.3/manual.html#6.8 /** @noSelfInFile */ /** * The I/O library provides two different styles for file manipulation. The * first one uses implicit file handles; that is, there are operations to set a * default input file and a default output file, and all input/output operations * are over these default files. The second style uses explicit file handles. * * When using implicit file handles, all operations are supplied by table io. * When using explicit file handles, the operation io.open returns a file handle * and then all operations are supplied as methods of the file handle. * * The table io also provides three predefined file handles with their usual * meanings from C: io.stdin, io.stdout, and io.stderr. The I/O library never * closes these files. * * Unless otherwise stated, all I/O functions return nil on failure (plus an * error message as a second result and a system-dependent error code as a third * result) and some value different from nil on success. On non-POSIX systems, * the computation of the error message and error code in case of errors may be * not thread safe, because they rely on the global C variable errno. */ declare namespace io { /** * Equivalent to file:close(). Without a file, closes the default output file. */ function close(file?: LuaFile): boolean; /** * Equivalent to io.output():flush(). */ function flush(): boolean; /** * When called with a file name, it opens the named file (in text mode), and * sets its handle as the default input file. When called with a file handle, * it simply sets this file handle as the default input file. When called * without parameters, it returns the current default input file. * * In case of errors this function raises the error, instead of returning an * error code. */ function input(file?: string | LuaFile): LuaFile; /** * Opens the given file name in read mode and returns an iterator function * that works like file:lines(···) over the opened file. When the iterator * function detects the end of file, it returns no values (to finish the loop) * and automatically closes the file. * * The call io.lines() (with no file name) is equivalent to * io.input():lines("*l"); that is, it iterates over the lines of the default * input file. In this case it does not close the file when the loop ends. * * In case of errors this function raises the error, instead of returning an * error code. */ function lines<T extends FileReadFormat[]>( filename?: string, ...formats: T ): LuaIterable< LuaMultiReturn<[] extends T ? [string] : { [P in keyof T]: FileReadFormatToType<T[P]> }> >; /** * This function opens a file, in the mode specified in the string mode. In * case of success, it returns a new file handle. * * The mode string can be any of the following: * * * "r": read mode (the default); * * "w": write mode; * * "a": append mode; * * "r+": update mode, all previous data is preserved; * * "w+": update mode, all previous data is erased; * * "a+": append update mode, previous data is preserved, writing is only * allowed at the end of file. * * The mode string can also have a 'b' at the end, which is needed in some * systems to open the file in binary mode. */ function open( filename: string, mode?: string ): LuaMultiReturn<[LuaFile] | [undefined, string, number]>; /** * Similar to io.input, but operates over the default output file. */ function output(file?: string | LuaFile): LuaFile; /** * This function is system dependent and is not available on all platforms. * * Starts program prog in a separated process and returns a file handle that * you can use to read data from this program (if mode is "r", the default) or * to write data to this program (if mode is "w"). */ function popen(prog: string, mode?: 'r' | 'w'): LuaMultiReturn<[LuaFile] | [undefined, string]>; /** * Equivalent to io.input():read(···). */ function read(): io.FileReadFormatToType<io.FileReadLineFormat> | undefined; function read<T extends io.FileReadFormat>(format: T): io.FileReadFormatToType<T> | undefined; function read<T extends io.FileReadFormat[]>( ...formats: T ): LuaMultiReturn<{ [P in keyof T]?: io.FileReadFormatToType<T[P]> }>; /** * Predefined file handle for standard error stream. The I/O library never closes this file. */ const stderr: LuaFile; /** * Predefined file handle for standard input stream. The I/O library never closes this file. */ const stdin: LuaFile; /** * Predefined file handle for standard output stream. The I/O library never closes this file. */ const stdout: LuaFile; /** * In case of success, returns a handle for a temporary file. This file is * opened in update mode and it is automatically removed when the program * ends. */ function tmpfile(): LuaFile; /** * Checks whether obj is a valid file handle. Returns the string "file" if obj * is an open file handle, "closed file" if obj is a closed file handle, or * nil if obj is not a file handle. */ function type(obj: any): 'file' | 'closed file' | undefined; /** * Equivalent to io.output():write(···). */ function write(...args: (string | number)[]): LuaMultiReturn<[LuaFile] | [undefined, string]>; type FileReadFormatToType<T> = T extends FileReadNumberFormat ? number : string; } interface LuaFile { /** * Closes file. Note that files are automatically closed when their handles * are garbage collected, but that takes an unpredictable amount of time to * happen. * * When closing a file handle created with io.popen, file:close returns the * same values returned by os.execute. */ close(): boolean; /** * Saves any written data to file. */ flush(): boolean; /** * Returns an iterator function that, each time it is called, reads the file * according to the given formats. When no format is given, uses "l" as a * default. As an example, the construction * * `for c in file:lines(1) do body end` * * will iterate over all characters of the file, starting at the current * position. Unlike io.lines, this function does not close the file when the * loop ends. * * In case of errors this function raises the error, instead of returning an * error code. */ lines<T extends io.FileReadFormat[]>( ...formats: T ): LuaIterable< LuaMultiReturn<[] extends T ? [string] : { [P in keyof T]: io.FileReadFormatToType<T[P]> }> >; /** * Reads the file file, according to the given formats, which specify what to * read. For each format, the function returns a string or a number with the * characters read, or nil if it cannot read data with the specified format. * (In this latter case, the function does not read subsequent formats.) When * called without formats, it uses a default format that reads the next line * (see below). * * The available formats are * * * "n": reads a numeral and returns it as a float or an integer, following * the lexical conventions of Lua. (The numeral may have leading spaces and * a sign.) This format always reads the longest input sequence that is a * valid prefix for a numeral; if that prefix does not form a valid numeral * (e.g., an empty string, "0x", or "3.4e-"), it is discarded and the * function returns nil. * * "a": reads the whole file, starting at the current position. On end of * file, it returns the empty string. * * "l": reads the next line skipping the end of line, returning nil on end * of file. This is the default format. * * "L": reads the next line keeping the end-of-line character (if present), * returning nil on end of file. * * number: reads a string with up to this number of bytes, returning nil on * end of file. If number is zero, it reads nothing and returns an empty * string, or nil on end of file. * * The formats "l" and "L" should be used only for text files. */ read(): io.FileReadFormatToType<io.FileReadLineFormat> | undefined; read<T extends io.FileReadFormat>(format: T): io.FileReadFormatToType<T> | undefined; read<T extends io.FileReadFormat[]>( ...formats: T ): LuaMultiReturn<{ [P in keyof T]?: io.FileReadFormatToType<T[P]> }>; /** * Sets and geionts the file position, measured from the beginning of the * file, to the posit given by offset plus a base specified by the string * whence, as follows: * * * "set": base is position 0 (beginning of the file); * * "cur": base is current position; * * "end": base is end of file; * * In case of success, seek returns the final file position, measured in bytes * from the beginning of the file. If seek fails, it returns nil, plus a * string describing the error. * * The default value for whence is "cur", and for offset is 0. Therefore, the * call file:seek() returns the current file position, without changing it; * the call file:seek("set") sets the position to the beginning of the file * (and returns 0); and the call file:seek("end") sets the position to the end * of the file, and returns its size. */ seek( whence?: 'set' | 'cur' | 'end', offset?: number ): LuaMultiReturn<[number] | [undefined, string]>; /** * Sets the buffering mode for an output file. There are three available * modes: * * * "no": no buffering; the result of any output operation appears * immediately. * * "full": full buffering; output operation is performed only when the * buffer is full or when you explicitly flush the file (see io.flush). * * "line": line buffering; output is buffered until a newline is output or * there is any input from some special files (such as a terminal device). * For the last two cases, size specifies the size of the buffer, in bytes. * The default is an appropriate size. */ setvbuf(mode: 'no' | 'full' | 'line', size?: number): void; /** * Writes the value of each of its arguments to file. The arguments must be * strings or numbers. * * In case of success, this function returns file. Otherwise it returns nil * plus a string describing the error. */ write(...args: (string | number)[]): LuaMultiReturn<[LuaFile] | [undefined, string]>; }