7.2.261-stable

std > io > Source

abstract type Writer<T> {
  private path: String;
  private append: bool?;
  /// append the value v to the current writer.
  abstract fn write(v: T);
  /// flush buffer to disk, mandatory to open reader on same path
  abstract fn flush(v: T);
}

abstract type Reader<T> {
  private path: String;
  pos: int?;

  /// read a value from the reader.
  abstract fn read(): T;
  /// tells whether this reader has more to read
  abstract fn can_read(): bool;
  /// return the amount of available bytes in reader.
  abstract fn available(): int;
}

/// GreyCat Binary (ABI encoded) writer utility can export a stream of serializable values to file.
type GcbWriter<T> extends Writer<T> {
  native fn write(v: T);
  native fn flush();
}

/// GreyCat Binary (ABI encoded) reader utility can read/import a stream of serializable values from file.
type GcbReader<T> extends Reader<T> {
  native fn read(): T;
  native fn can_read(): bool;
  native fn available(): int;
}

/// Text writer utility can export values as text (utf-8), mostly used for line based format.
type TextWriter<T> extends Writer<T> {
  native fn write(v: T);
  native fn flush();
  /// write the v param as text in writer and add a line separator.
  native fn writeln(v: T);
}

/// Text reader utility can read text file line by line (utf-8)
type TextReader extends Reader<String> {
  native fn read(): String;
  native fn can_read(): bool;
  native fn available(): int;
}

/// Text reader utility can read text file line by line (utf-8)
type XmlReader<T> extends Reader<T> {
  native fn read(): T;
  native fn can_read(): bool;
  native fn available(): int;
}

/// Json writer utility can export values as JSON (utf-8)
type JsonWriter<T> extends Writer<T> {
  native fn write(v: T);
  native fn flush();
  /// write the v param as json element in writer followed by a line separator.
  native fn writeln(v: T);
}

/// Json reader utility can read/import a stream of serializable values from file (ndjson or line separated json)
type JsonReader<T> extends Reader<T> {
  native fn read(): T;
  native fn can_read(): bool;
  native fn available(): int;
}

type Json<T> {
  /// Parses a JSON string into a GreyCat value.
  ///
  /// If a generic type `T` is provided, the parser attempts to deserialize
  /// the input into that type. An error is thrown if the JSON does not
  /// match `T`.
  native fn parse(data: String): T;
  /// Serializes a GreyCat value into its JSON string representation.
  static native fn to_string(value: any?): String;
}

/// CSV writer utility can export a stream of GreyCat values as CSV lines (utf-8)
///
/// If the generic parameter is a non-primitive type, the field names of that type
/// will be used as headers if `format.header_lines > 0`. The automatic headers will
/// be lazily written. Which means the first call to `write()` will write the headers
/// if the underlying file/buf is empty.
type CsvWriter<T> extends Writer<T> {
  private format: CsvFormat?;
  native fn write(v: T);
  /// Writes the given line as-is.
  ///
  /// If this method is called before any `write()` and with `format.header_lines > 0`
  /// no headers will be added automatically based on the generic parameter type.
  ///
  /// No need to add a newline character (`'\n'`), it will be added automatically.
  ///
  /// *Note: if the given `String` contains newline character (`'\n'`) they will not
  /// be escaped by this method and will be directly written to the underlying file/buf.*
  native fn write_line(line: String);
  native fn flush();
}

type CsvSharding {
  /// The id of this shard
  id: int;
  /// The column offset used for hashing
  column: int;
  /// The count of unique value for the column
  modulo: int;
}

/// CSV reader utility can read/import a stream of serializable values from CSV lines (utf-8)
type CsvReader<T> extends Reader<T> {
  private format: CsvFormat?;
  private sharding: CsvSharding?;

  /// Parses a line and returns a `T` only if valid
  ///
  /// If the parsed line does not comply with the given `T` type, the line is skipped
  /// and an error is thrown.
  native fn read(): T;

  /// Returns the last line or `null` if the end of file is reached
  native fn last_line(): String?;

  native fn can_read(): bool;

  native fn available(): int;

  /// Changes the path to the underlying file.
  /// It will reset the reader state to start reading from the start of the new file.
  ///
  /// *Re-using a reader might improve performance when dealing with many files as the buffers
  /// and initialization of the format will be re-used instead of being re-created.*
  native fn set_path(path: String);
}

type CsvFormat {
  /// Number of header lines. `null` or `0` means none and is the default.
  header_lines: int?;
  /// The column separator character (can only be one-byte wide)
  separator: char?;
  /// Can only be one-byte wide, eg. `'"'`
  string_delimiter: char?;
  /// Can only be one-byte wide, eg. `','`
  decimal_separator: char?;
  /// Can only be one-byte wide, eg. `'_'`
  thousands_separator: char?;
  /// Whether or not to trim spaces (.ie ` `, `\t`, `\r` and `\n`) from start and end, defaults to `false`
  trim: bool?;
  /// The format to parse date in, defaults to ISO8601/epoch timestamp in milliseconds.
  format: String?;
  /// The timezone to interpret times in, defaults to the host global timezone.
  tz: TimeZone?;
  /// Whether or not to enable strict null checking. By default the parser will accept
  /// any invalid value as a `null` as long as the target type for that column is nullable.
  strict: bool?;
  /// Whether or not to fallback to the nearest time when an invalid date is found, defaults to `false`
  nearest_time: bool?;
}

type CsvColumnStatistics {
  /// column name as in CSV header
  name: String?;
  /// one value
  example: any?;
  /// number of null values
  null_count: int;
  /// number of boolean values
  bool_count: int;
  /// number of integer values
  int_count: int;
  /// number of float values
  float_count: int;
  /// number of string values
  string_count: int;
  /// number of date values
  date_count: int;
  /// occurrence of each date format matched
  date_format_count: Map<String, int>;
  /// occurrences of the `enumerable_limit` values found
  /// a value can be string, int or float
  enumerable_count: Map<any, int>;
  /// statistics on numeric values
  profile: Gaussian;
}

type CsvStatistics {
  header_lines: int?;
  separator: char?;
  string_delimiter: char?;
  decimal_separator: char?;
  thousands_separator: char?;
  /// statistics per column
  columns: Array<CsvColumnStatistics>;
  /// accumulated analyzed (failed + parsed) rows for all accumulated CSV files
  line_count: int;
  /// accumulated number of failed lines for CSV files
  fail_count: int;
  /// number of CSV files explored
  file_count: int;
}

type CsvAnalysisConfig {
  static enumerable_limit_default: int = 100;
  static date_check_limit_default: int = 100;
  /// CsvAnalysis will try to detect header_lines if not set
  header_lines: int?;
  /// CsvAnalysis will try to detect separator if not set
  separator: char?;
  string_delimiter: char?;
  decimal_separator: char?;
  thousands_separator: char?;
  /// `row_limit`:
  /// maximum number of rows to parse for statistics collection
  /// default value (when not set) means all rows are parsed
  row_limit: int?;
  /// `enumerable_limit`:
  /// maximum number of enumerable elements to detect
  /// default value (when not set) is 100 (enumerable_limit_default)
  /// special values are 0: none, -1: all
  enumerable_limit: int?;
  /// `date_check_limit`:
  /// check for dates for first 'date_check_limit' rows, but still keep statistics until 'row_limit'
  /// default value (when not set) is 100 (date_check_limit_default)
  /// special values are 0: none, -1: all
  /// if a cell of a column matches, then continue until 'row_limit'
  date_check_limit: int?;
  /// date formats to look for, in addition to default formats
  date_formats: Array<String>?;
}

type Csv {
  /// Generates the necessary types and enums to read the records defined by this statistics
  @expose
  static native fn generate(stats: CsvStatistics): String;
  /// Analyses a collection of csv files to infer statistics eventually to generate types
  @expose
  static native fn analyze(files: Array<File>, config: CsvAnalysisConfig?): CsvStatistics;
  /// Aggregates reads into a `Table`
  ///
  /// By specifying `reader.pos` the reads will be made after the end of the line at that byte offset
  @expose
  static native fn sample(reader: CsvReader, max_lines: int?): Table;
}

/// represents a file entry within operating system file system, can be plain file or directory.
type File {
  /// path of the file entry
  path: String;
  /// size of the file, null if is directory
  size: int?;
  /// last modification of the file
  last_modification: time?;
  /// Returns the relative path to the directory for files
  /// *Accessible remotely at `/files/`*
  static native fn baseDir(): String;
  /// Returns the relative path to the directory of the current user
  /// *Accessible remotely at `/files/<user_id>/`*
  static native fn userDir(): String;
  /// Returns the relative path to the directory of the current task or request
  /// *Accessible remotely at `/files/<user_id>/tasks/<task_id>/`*
  /// *or for requests at `/files/<user_id>/requests/<timestamp>/`*
  static native fn workingDir(): String;
  /// Retrieve File from a path, return null if file not found
  static native fn open(path: String): File?;
  /// Deletes the file or directory from disk
  static native fn delete(path: String): bool;
  /// Rename the file or directory from disk
  static native fn rename(old_path: String, new_path: String): bool;
  /// Copy the file from disk
  static native fn copy(src_path: String, target_path: String): bool;
  /// Create directory and sub directory
  static native fn mkdir(path: String): bool;
  /// List all file, optionally filtered by ends_with suffix (e.g. select .csv extension), recursively or not
  static native fn ls(path: String, ends_with: String?, recursive: bool): Array<File>;
  /// Returns true in case the File describes a directory (therefore path ends with a '/'), false otherwise
  native fn isDir(): bool;
  /// Returns the name of the file
  native fn name(): String;
  /// Returns the name of the extension specific to the file
  native fn extension(): String?;
  /// Returns the sha256 of the file, null in case of directory
  native fn sha256(): String?;
}

/// Utility to iterate over files and directory of a file system
type FileWalker {
  private path: String;
  /// Return true if next() method will not return a file
  native fn isEmpty(): bool;
  /// Return the next file
  native fn next(): File?;
}

/// Represents an URL string representation (e.g. `schema://host:port/path?param_key=paramValue#hash`)
type Url {
  protocol: String?;
  host: String?;
  port: int?;
  path: String?;
  params: Map<String, String>?;
  hash: String?;
  /// create an URL from a string representation
  static native fn parse(url: String): Url;
  /// Encode any object as x-www-form-urlencoded content-type
  /// String are url encoded, objects and map are flatten and values are url encodded
  static native fn encode(value: any): String;
}

enum HttpMethod {
  GET,
  HEAD,
  POST,
  PUT,
  DELETE,
  CONNECT,
  OPTIONS,
  TRACE,
  PATCH;
}

/// Http request wrapper
type HttpRequest {
  method: HttpMethod;
  url: String;
  headers: Map<String,String>?;
  body: String?;
}

/// Http response wrapper
type HttpResponse<T> {
  status_code: int;
  headers: Map<String,String>;
  content: T?;
  error_msg: String?;
}

/// Utility to handle http request get, post or put
type Http<T> {
  native fn get(url: String, headers: Map<String,String>?): T;
  native fn getFile(url: String, path: String, headers: Map<String,String>?);
  native fn post(url: String, body: any?, headers: Map<String,String>?): T;
  native fn put(url: String, body: any?, headers: Map<String,String>?): T;
  native fn send(request: HttpRequest): HttpResponse<T>;
}

/// represent an email instance to be sent through SMTP utility
type Email {
  from: String;
  subject: String;
  body: String;
  body_is_html: bool;
  to: Array<String>;
  cc: Array<String>?;
  bcc: Array<String>?;
}

/// Smtp Encryption Mode
enum SmtpMode {
  /// plain exchange mode
  plain(0);
  /// ssl tls exchange mode
  ssl_tls(1);
  /// starttls exchange node
  starttls(2);
}

/// Smtp authentication method
enum SmtpAuth {
  /// no authentication
  none(0);
  /// basic authentication method
  plain(1);
  /// login:pass authentication method
  login(2);
}

/// Utility to send mail through smtp protocol
type Smtp {
  host: String;
  port: int;
  mode: SmtpMode?;
  authenticate: SmtpAuth?;
  user: String?;
  pass: String?;
  /// Send the parameter mail through smtp protocol
  native fn send(email: Email);
}