generate ts types from rust (#291)
* initial types Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * start using generated types Signed-off-by: Jess Frazelle <github@jessfraz.com> * generate ast types Signed-off-by: Jess Frazelle <github@jessfraz.com> * cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> * generate for error types as well Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -24,5 +24,6 @@ yarn-error.log*
 | 
			
		||||
 | 
			
		||||
# rust
 | 
			
		||||
src/wasm-lib/target
 | 
			
		||||
src/wasm-lib/bindings
 | 
			
		||||
public/wasm_lib_bg.wasm
 | 
			
		||||
src/wasm-lib/lcov.info
 | 
			
		||||
 | 
			
		||||
@ -58,9 +58,9 @@
 | 
			
		||||
    "simpleserver": "http-server ./public --cors -p 3000",
 | 
			
		||||
    "fmt": "prettier --write ./src",
 | 
			
		||||
    "fmt-check": "prettier --check ./src",
 | 
			
		||||
    "build:wasm": "yarn wasm-prep && (cd src/wasm-lib && wasm-pack build --target web --out-dir pkg) && cp src/wasm-lib/pkg/wasm_lib_bg.wasm public && yarn fmt && yarn remove-importmeta",
 | 
			
		||||
    "build:wasm": "yarn wasm-prep && (cd src/wasm-lib && wasm-pack build --target web --out-dir pkg && cargo test --all) && cp src/wasm-lib/pkg/wasm_lib_bg.wasm public && yarn fmt && yarn remove-importmeta",
 | 
			
		||||
    "remove-importmeta": "sed -i 's/import.meta.url//g' \"./src/wasm-lib/pkg/wasm_lib.js\"; sed -i '' 's/import.meta.url//g' \"./src/wasm-lib/pkg/wasm_lib.js\" || echo \"sed for both mac and linux\"",
 | 
			
		||||
    "wasm-prep": "rm -rf src/wasm-lib/pkg && mkdir src/wasm-lib/pkg",
 | 
			
		||||
    "wasm-prep": "rm -rf src/wasm-lib/pkg && mkdir src/wasm-lib/pkg && rm -rf src/wasm-lib/bindings",
 | 
			
		||||
    "lint": "eslint --fix src",
 | 
			
		||||
    "bump-jsons": "echo \"$(jq --arg v \"$VERSION\" '.version=$v' package.json --indent 2)\" > package.json && echo \"$(jq --arg v \"$VERSION\" '.package.version=$v' src-tauri/tauri.conf.json --indent 2)\" > src-tauri/tauri.conf.json"
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,21 @@
 | 
			
		||||
export type { Program } from '../wasm-lib/bindings/Program'
 | 
			
		||||
export type { Value } from '../wasm-lib/bindings/Value'
 | 
			
		||||
export type { ObjectExpression } from '../wasm-lib/bindings/ObjectExpression'
 | 
			
		||||
export type { MemberExpression } from '../wasm-lib/bindings/MemberExpression'
 | 
			
		||||
export type { PipeExpression } from '../wasm-lib/bindings/PipeExpression'
 | 
			
		||||
export type { VariableDeclaration } from '../wasm-lib/bindings/VariableDeclaration'
 | 
			
		||||
export type { PipeSubstitution } from '../wasm-lib/bindings/PipeSubstitution'
 | 
			
		||||
export type { Identifier } from '../wasm-lib/bindings/Identifier'
 | 
			
		||||
export type { UnaryExpression } from '../wasm-lib/bindings/UnaryExpression'
 | 
			
		||||
export type { BinaryExpression } from '../wasm-lib/bindings/BinaryExpression'
 | 
			
		||||
export type { ReturnStatement } from '../wasm-lib/bindings/ReturnStatement'
 | 
			
		||||
export type { ExpressionStatement } from '../wasm-lib/bindings/ExpressionStatement'
 | 
			
		||||
export type { CallExpression } from '../wasm-lib/bindings/CallExpression'
 | 
			
		||||
export type { VariableDeclarator } from '../wasm-lib/bindings/VariableDeclarator'
 | 
			
		||||
export type { BinaryPart } from '../wasm-lib/bindings/BinaryPart'
 | 
			
		||||
export type { Literal } from '../wasm-lib/bindings/Literal'
 | 
			
		||||
export type { ArrayExpression } from '../wasm-lib/bindings/ArrayExpression'
 | 
			
		||||
 | 
			
		||||
export type SyntaxType =
 | 
			
		||||
  | 'Program'
 | 
			
		||||
  | 'ExpressionStatement'
 | 
			
		||||
@ -18,160 +36,3 @@ export type SyntaxType =
 | 
			
		||||
  | 'Literal'
 | 
			
		||||
  | 'NoneCodeNode'
 | 
			
		||||
  | 'UnaryExpression'
 | 
			
		||||
 | 
			
		||||
export interface Program {
 | 
			
		||||
  type: SyntaxType
 | 
			
		||||
  start: number
 | 
			
		||||
  end: number
 | 
			
		||||
  body: BodyItem[]
 | 
			
		||||
  nonCodeMeta: NoneCodeMeta
 | 
			
		||||
}
 | 
			
		||||
interface GeneralStatement {
 | 
			
		||||
  type: SyntaxType
 | 
			
		||||
  start: number
 | 
			
		||||
  end: number
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type BodyItem =
 | 
			
		||||
  | ExpressionStatement
 | 
			
		||||
  | VariableDeclaration
 | 
			
		||||
  | ReturnStatement
 | 
			
		||||
 | 
			
		||||
export type Value =
 | 
			
		||||
  | Literal
 | 
			
		||||
  | Identifier
 | 
			
		||||
  | BinaryExpression
 | 
			
		||||
  | FunctionExpression
 | 
			
		||||
  | CallExpression
 | 
			
		||||
  | PipeExpression
 | 
			
		||||
  | PipeSubstitution
 | 
			
		||||
  | ArrayExpression
 | 
			
		||||
  | ObjectExpression
 | 
			
		||||
  | MemberExpression
 | 
			
		||||
  | UnaryExpression
 | 
			
		||||
 | 
			
		||||
export type BinaryPart =
 | 
			
		||||
  | Literal
 | 
			
		||||
  | Identifier
 | 
			
		||||
  | BinaryExpression
 | 
			
		||||
  | CallExpression
 | 
			
		||||
  | UnaryExpression
 | 
			
		||||
 | 
			
		||||
export interface NoneCodeNode extends GeneralStatement {
 | 
			
		||||
  type: 'NoneCodeNode'
 | 
			
		||||
  value: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface NoneCodeMeta {
 | 
			
		||||
  // Stores the whitespace/comments that go after the statement who's index we're using here
 | 
			
		||||
  noneCodeNodes: { [statementIndex: number]: NoneCodeNode }
 | 
			
		||||
  // Which is why we also need `start` for and whitespace at the start of the file/block
 | 
			
		||||
  start?: NoneCodeNode
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ExpressionStatement extends GeneralStatement {
 | 
			
		||||
  type: 'ExpressionStatement'
 | 
			
		||||
  expression: Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface CallExpression extends GeneralStatement {
 | 
			
		||||
  type: 'CallExpression'
 | 
			
		||||
  callee: Identifier
 | 
			
		||||
  arguments: Value[]
 | 
			
		||||
  optional: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface VariableDeclaration extends GeneralStatement {
 | 
			
		||||
  type: 'VariableDeclaration'
 | 
			
		||||
  declarations: VariableDeclarator[]
 | 
			
		||||
  kind: 'const' | 'unknown' | 'fn' //| "solid" | "surface" | "face"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface VariableDeclarator extends GeneralStatement {
 | 
			
		||||
  type: 'VariableDeclarator'
 | 
			
		||||
  id: Identifier
 | 
			
		||||
  init: Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface Literal extends GeneralStatement {
 | 
			
		||||
  type: 'Literal'
 | 
			
		||||
  value: string | number | boolean | null
 | 
			
		||||
  raw: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface Identifier extends GeneralStatement {
 | 
			
		||||
  type: 'Identifier'
 | 
			
		||||
  name: string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface PipeSubstitution extends GeneralStatement {
 | 
			
		||||
  type: 'PipeSubstitution'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ArrayExpression extends GeneralStatement {
 | 
			
		||||
  type: 'ArrayExpression'
 | 
			
		||||
  elements: Value[]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ObjectExpression extends GeneralStatement {
 | 
			
		||||
  type: 'ObjectExpression'
 | 
			
		||||
  properties: ObjectProperty[]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ObjectProperty extends GeneralStatement {
 | 
			
		||||
  type: 'ObjectProperty'
 | 
			
		||||
  key: Identifier
 | 
			
		||||
  value: Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface MemberExpression extends GeneralStatement {
 | 
			
		||||
  type: 'MemberExpression'
 | 
			
		||||
  object: MemberExpression | Identifier
 | 
			
		||||
  property: Identifier | Literal
 | 
			
		||||
  computed: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ObjectKeyInfo {
 | 
			
		||||
  key: Identifier | Literal
 | 
			
		||||
  index: number
 | 
			
		||||
  computed: boolean
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface BinaryExpression extends GeneralStatement {
 | 
			
		||||
  type: 'BinaryExpression'
 | 
			
		||||
  operator: string
 | 
			
		||||
  left: BinaryPart
 | 
			
		||||
  right: BinaryPart
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface UnaryExpression extends GeneralStatement {
 | 
			
		||||
  type: 'UnaryExpression'
 | 
			
		||||
  operator: '-' | '!'
 | 
			
		||||
  argument: BinaryPart
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface PipeExpression extends GeneralStatement {
 | 
			
		||||
  type: 'PipeExpression'
 | 
			
		||||
  body: Value[]
 | 
			
		||||
  nonCodeMeta: NoneCodeMeta
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface FunctionExpression extends GeneralStatement {
 | 
			
		||||
  type: 'FunctionExpression'
 | 
			
		||||
  id: Identifier | null
 | 
			
		||||
  params: Identifier[]
 | 
			
		||||
  body: BlockStatement
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface BlockStatement extends GeneralStatement {
 | 
			
		||||
  type: 'BlockStatement'
 | 
			
		||||
  body: BodyItem[]
 | 
			
		||||
  nonCodeMeta: NoneCodeMeta
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ReturnStatement extends GeneralStatement {
 | 
			
		||||
  type: 'ReturnStatement'
 | 
			
		||||
  argument: Value
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type All = Program | ExpressionStatement[] | BinaryExpression | Literal
 | 
			
		||||
 | 
			
		||||
@ -103,11 +103,10 @@ describe('Testing addSketchTo', () => {
 | 
			
		||||
  it('should add a sketch to a program', () => {
 | 
			
		||||
    const result = addSketchTo(
 | 
			
		||||
      {
 | 
			
		||||
        type: 'Program',
 | 
			
		||||
        body: [],
 | 
			
		||||
        start: 0,
 | 
			
		||||
        end: 0,
 | 
			
		||||
        nonCodeMeta: { noneCodeNodes: {} },
 | 
			
		||||
        nonCodeMeta: { noneCodeNodes: {}, start: null },
 | 
			
		||||
      },
 | 
			
		||||
      'yz'
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
@ -452,7 +452,7 @@ export function createPipeExpression(
 | 
			
		||||
    start: 0,
 | 
			
		||||
    end: 0,
 | 
			
		||||
    body,
 | 
			
		||||
    nonCodeMeta: { noneCodeNodes: {} },
 | 
			
		||||
    nonCodeMeta: { noneCodeNodes: {}, start: null },
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,23 +1,8 @@
 | 
			
		||||
import { lexer_js } from '../wasm-lib/pkg/wasm_lib'
 | 
			
		||||
import { initPromise } from './rust'
 | 
			
		||||
import { Token } from '../wasm-lib/bindings/Token'
 | 
			
		||||
 | 
			
		||||
export interface Token {
 | 
			
		||||
  type:
 | 
			
		||||
    | 'number'
 | 
			
		||||
    | 'word'
 | 
			
		||||
    | 'operator'
 | 
			
		||||
    | 'string'
 | 
			
		||||
    | 'brace'
 | 
			
		||||
    | 'whitespace'
 | 
			
		||||
    | 'comma'
 | 
			
		||||
    | 'colon'
 | 
			
		||||
    | 'period'
 | 
			
		||||
    | 'linecomment'
 | 
			
		||||
    | 'blockcomment'
 | 
			
		||||
  value: string
 | 
			
		||||
  start: number
 | 
			
		||||
  end: number
 | 
			
		||||
}
 | 
			
		||||
export type { Token } from '../wasm-lib/bindings/Token'
 | 
			
		||||
 | 
			
		||||
export async function asyncLexer(str: string): Promise<Token[]> {
 | 
			
		||||
  await initPromise
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										70
									
								
								src/wasm-lib/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										70
									
								
								src/wasm-lib/Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -2,6 +2,12 @@
 | 
			
		||||
# It is not intended for manual editing.
 | 
			
		||||
version = 3
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "Inflector"
 | 
			
		||||
version = "0.11.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "addr2line"
 | 
			
		||||
version = "0.20.0"
 | 
			
		||||
@ -46,7 +52,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@ -278,7 +284,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@ -694,7 +700,7 @@ dependencies = [
 | 
			
		||||
 "regex",
 | 
			
		||||
 "regex-syntax 0.7.4",
 | 
			
		||||
 "structmeta",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@ -1126,7 +1132,7 @@ dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "structmeta-derive",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@ -1137,7 +1143,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@ -1153,15 +1159,24 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syn"
 | 
			
		||||
version = "2.0.26"
 | 
			
		||||
version = "2.0.29"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970"
 | 
			
		||||
checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "unicode-ident",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "termcolor"
 | 
			
		||||
version = "1.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "winapi-util",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "thiserror"
 | 
			
		||||
version = "1.0.47"
 | 
			
		||||
@ -1179,7 +1194,7 @@ checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@ -1262,7 +1277,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
@ -1280,6 +1295,29 @@ version = "0.2.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ts-rs"
 | 
			
		||||
version = "7.0.0"
 | 
			
		||||
source = "git+https://github.com/kittycad/ts-rs.git?branch=serde_json#94e2a19c41194e47009fafc7b5a2c28ae544a6e8"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "serde_json",
 | 
			
		||||
 "thiserror",
 | 
			
		||||
 "ts-rs-macros",
 | 
			
		||||
 "uuid",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ts-rs-macros"
 | 
			
		||||
version = "7.0.0"
 | 
			
		||||
source = "git+https://github.com/kittycad/ts-rs.git?branch=serde_json#94e2a19c41194e47009fafc7b5a2c28ae544a6e8"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "Inflector",
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
 "termcolor",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "unicase"
 | 
			
		||||
version = "2.6.0"
 | 
			
		||||
@ -1387,7 +1425,7 @@ dependencies = [
 | 
			
		||||
 "once_cell",
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
 "wasm-bindgen-shared",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@ -1421,7 +1459,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "proc-macro2",
 | 
			
		||||
 "quote",
 | 
			
		||||
 "syn 2.0.26",
 | 
			
		||||
 "syn 2.0.29",
 | 
			
		||||
 "wasm-bindgen-backend",
 | 
			
		||||
 "wasm-bindgen-shared",
 | 
			
		||||
]
 | 
			
		||||
@ -1448,6 +1486,7 @@ dependencies = [
 | 
			
		||||
 "serde-wasm-bindgen",
 | 
			
		||||
 "serde_json",
 | 
			
		||||
 "thiserror",
 | 
			
		||||
 "ts-rs",
 | 
			
		||||
 "wasm-bindgen",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@ -1496,6 +1535,15 @@ version = "0.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "winapi-util"
 | 
			
		||||
version = "0.1.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "winapi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "winapi-x86_64-pc-windows-gnu"
 | 
			
		||||
version = "0.4.0"
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ serde = {version = "1.0.152", features = ["derive"] }
 | 
			
		||||
serde-wasm-bindgen = "0.3.0"
 | 
			
		||||
serde_json = "1.0.93"
 | 
			
		||||
thiserror = "1.0.47"
 | 
			
		||||
ts-rs = { git = "https://github.com/kittycad/ts-rs.git", branch = "serde_json", features = ["serde-json-impl", "uuid-impl"] }
 | 
			
		||||
wasm-bindgen = "0.2.87"
 | 
			
		||||
 | 
			
		||||
[profile.release]
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,11 @@
 | 
			
		||||
//! Data types for the AST.
 | 
			
		||||
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(rename_all = "camelCase")]
 | 
			
		||||
pub struct Program {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -12,7 +14,8 @@ pub struct Program {
 | 
			
		||||
    pub non_code_meta: NoneCodeMeta,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub enum BodyItem {
 | 
			
		||||
    ExpressionStatement(ExpressionStatement),
 | 
			
		||||
@ -20,7 +23,8 @@ pub enum BodyItem {
 | 
			
		||||
    ReturnStatement(ReturnStatement),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub enum Value {
 | 
			
		||||
    Literal(Box<Literal>),
 | 
			
		||||
@ -36,7 +40,8 @@ pub enum Value {
 | 
			
		||||
    UnaryExpression(Box<UnaryExpression>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub enum BinaryPart {
 | 
			
		||||
    Literal(Box<Literal>),
 | 
			
		||||
@ -46,7 +51,8 @@ pub enum BinaryPart {
 | 
			
		||||
    UnaryExpression(Box<UnaryExpression>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct NoneCodeNode {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -54,7 +60,8 @@ pub struct NoneCodeNode {
 | 
			
		||||
    pub value: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(rename_all = "camelCase")]
 | 
			
		||||
pub struct NoneCodeMeta {
 | 
			
		||||
    pub none_code_nodes: HashMap<usize, NoneCodeNode>,
 | 
			
		||||
@ -87,14 +94,18 @@ impl<'de> Deserialize<'de> for NoneCodeMeta {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ExpressionStatement {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
    pub expression: Value,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct CallExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -103,7 +114,9 @@ pub struct CallExpression {
 | 
			
		||||
    pub optional: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct VariableDeclaration {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -111,7 +124,8 @@ pub struct VariableDeclaration {
 | 
			
		||||
    pub kind: String, // Change to enum if there are specific values
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct VariableDeclarator {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -120,7 +134,9 @@ pub struct VariableDeclarator {
 | 
			
		||||
    pub init: Value,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct Literal {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -128,7 +144,8 @@ pub struct Literal {
 | 
			
		||||
    pub raw: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct Identifier {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -136,27 +153,34 @@ pub struct Identifier {
 | 
			
		||||
    pub name: String,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct PipeSubstitution {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ArrayExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
    pub elements: Vec<Value>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ObjectExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
    pub properties: Vec<ObjectProperty>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ObjectProperty {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -165,21 +189,25 @@ pub struct ObjectProperty {
 | 
			
		||||
    pub value: Value,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub enum MemberObject {
 | 
			
		||||
    MemberExpression(Box<MemberExpression>),
 | 
			
		||||
    Identifier(Box<Identifier>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub enum LiteralIdentifier {
 | 
			
		||||
    Identifier(Box<Identifier>),
 | 
			
		||||
    Literal(Box<Literal>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct MemberExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -188,14 +216,17 @@ pub struct MemberExpression {
 | 
			
		||||
    pub computed: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
pub struct ObjectKeyInfo {
 | 
			
		||||
    pub key: LiteralIdentifier,
 | 
			
		||||
    pub index: usize,
 | 
			
		||||
    pub computed: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct BinaryExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -204,7 +235,9 @@ pub struct BinaryExpression {
 | 
			
		||||
    pub right: BinaryPart,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct UnaryExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -212,8 +245,9 @@ pub struct UnaryExpression {
 | 
			
		||||
    pub argument: BinaryPart,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[serde(rename_all = "camelCase")]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(rename_all = "camelCase", tag = "type")]
 | 
			
		||||
pub struct PipeExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -221,8 +255,9 @@ pub struct PipeExpression {
 | 
			
		||||
    pub non_code_meta: NoneCodeMeta,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct FunctionExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
@ -231,7 +266,8 @@ pub struct FunctionExpression {
 | 
			
		||||
    pub body: BlockStatement,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(rename_all = "camelCase", tag = "type")]
 | 
			
		||||
pub struct BlockStatement {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -240,7 +276,9 @@ pub struct BlockStatement {
 | 
			
		||||
    pub non_code_meta: NoneCodeMeta,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ReturnStatement {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,8 @@
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use thiserror::Error;
 | 
			
		||||
 | 
			
		||||
#[derive(Error, Debug, Serialize, Deserialize)]
 | 
			
		||||
#[derive(Error, Debug, Serialize, Deserialize, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "kind", rename_all = "snake_case")]
 | 
			
		||||
pub enum KclError {
 | 
			
		||||
    #[error("syntax: {0:?}")]
 | 
			
		||||
@ -20,7 +21,8 @@ pub enum KclError {
 | 
			
		||||
    InvalidExpression(crate::math_parser::MathExpression),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
pub struct KclErrorDetails {
 | 
			
		||||
    #[serde(rename = "sourceRanges")]
 | 
			
		||||
    pub source_ranges: Vec<[i32; 2]>,
 | 
			
		||||
 | 
			
		||||
@ -155,7 +155,8 @@ pub fn reverse_polish_notation(
 | 
			
		||||
    }))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
pub enum MathTokenType {
 | 
			
		||||
    Number,
 | 
			
		||||
    Word,
 | 
			
		||||
@ -171,7 +172,8 @@ pub enum MathTokenType {
 | 
			
		||||
    Parenthesis,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ParenthesisToken {
 | 
			
		||||
    pub token_type: MathTokenType,
 | 
			
		||||
@ -180,7 +182,8 @@ pub struct ParenthesisToken {
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ExtendedBinaryExpression {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -192,7 +195,8 @@ pub struct ExtendedBinaryExpression {
 | 
			
		||||
    pub end_extended: Option<usize>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub struct ExntendedLiteral {
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
@ -203,7 +207,8 @@ pub struct ExntendedLiteral {
 | 
			
		||||
    pub end_extended: Option<usize>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
 | 
			
		||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(tag = "type")]
 | 
			
		||||
pub enum MathExpression {
 | 
			
		||||
    ExntendedLiteral(Box<ExntendedLiteral>),
 | 
			
		||||
 | 
			
		||||
@ -400,14 +400,6 @@ pub fn recast_function(expression: FunctionExpression) -> String {
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
extern "C" {
 | 
			
		||||
    // Use `js_namespace` here to bind `console.log(..)` instead of just
 | 
			
		||||
    // `log(..)`
 | 
			
		||||
    #[wasm_bindgen(js_namespace = console)]
 | 
			
		||||
    fn log(s: &str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// wasm_bindgen wrapper for recast
 | 
			
		||||
// test for this function and by extension the recaster are done in javascript land src/lang/recast.test.ts
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,8 @@ use regex::Regex;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use wasm_bindgen::prelude::*;
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Copy, Clone, Deserialize, Serialize)]
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Copy, Clone, Deserialize, Serialize, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
#[serde(rename_all = "lowercase")]
 | 
			
		||||
pub enum TokenType {
 | 
			
		||||
    Number,
 | 
			
		||||
@ -20,38 +20,15 @@ pub enum TokenType {
 | 
			
		||||
    BlockComment,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone, ts_rs::TS)]
 | 
			
		||||
#[ts(export)]
 | 
			
		||||
pub struct Token {
 | 
			
		||||
    #[serde(rename = "type")]
 | 
			
		||||
    pub token_type: TokenType,
 | 
			
		||||
    pub start: usize,
 | 
			
		||||
    pub end: usize,
 | 
			
		||||
    #[wasm_bindgen(skip)]
 | 
			
		||||
    pub value: String,
 | 
			
		||||
}
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
impl Token {
 | 
			
		||||
    #[wasm_bindgen(constructor)]
 | 
			
		||||
    pub fn new(token_type: TokenType, value: String, start: usize, end: usize) -> Token {
 | 
			
		||||
        Token {
 | 
			
		||||
            token_type,
 | 
			
		||||
            value,
 | 
			
		||||
            start,
 | 
			
		||||
            end,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[wasm_bindgen(getter)]
 | 
			
		||||
    pub fn value(&self) -> String {
 | 
			
		||||
        self.value.clone()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[wasm_bindgen(setter)]
 | 
			
		||||
    pub fn set_value(&mut self, value: String) {
 | 
			
		||||
        self.value = value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
lazy_static! {
 | 
			
		||||
    static ref NUMBER: Regex = Regex::new(r"^-?\d+(\.\d+)?").unwrap();
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user