Mix . install ( [
{ :orb , "~> 0.0.41" } ,
{ :wasmex , "~> 0.8.3" }
] )
Define our gitignore parser module using Orb
defmodule GitIgnoreParser do
use Orb
SilverOrb.Lines . def GitIgnoreLineOffsetsSorted , pages: 1
SilverOrb.Input.Lines . def GitIgnoreContent , pages: 1 , export_write: :write_gitignore do
for line <- GitIgnoreContent . lines ( ) do
GitIgnoreLineOffsetsSorted . insert ( line . slice )
end
GitIgnoreLineOffsetsSorted . sort ( )
end
SilverOrb.Input . def Path , export_write: :write_path , pages: 1
defw ignored? ( ) , I32 do
for line <- GitIgnoreLineOffsetsSorted . lines ( ) do
local order = evaluate_line ( line , Path ) do
case order do
# before
- 1 ->
# continue
nop ( )
# after
1 ->
return ( i32 ( 0 ) )
# matches
0 ->
return ( i32 ( 1 ) )
end
end
end
end
defwp evaluate_line ( line: SilverOrb.Input.Line ) do
end
end
We can compile this module to the WebAssembly text format
Orb . to_wat ( GitIgnoreParser )
|> IO . puts ( )
We can run the WebAssembly module in Elixir using Wasmex
{ :ok , pid } = Wasmex . start_link ( % { bytes: Orb . to_wat ( GitIgnoreParser ) } )
{ :ok , [ start , length ] } = Wasmex . call_function ( pid , :write_gitignore_slice , [ ] )
write_string ( pid , :write_gitignore , start , length , ".DS_Store\n tmp/\n node_modules/" )
{ :ok , [ start , length ] } = Wasmex . call_function ( pid , :write_path_slice , [ ] )
write_string ( pid , :write_path , start , length , "some-file-name" )
{ :ok , [ ignored? ] } = Wasmex . call_function ( pid , :ignored? , [ ] )
IO . inspect ( ignored? , label: "ignored?" )