Skip to content

Instantly share code, notes, and snippets.

@skinnyjames
Created May 9, 2023 14:57
Show Gist options
  • Save skinnyjames/3bc5b2bf171a098b657ab8d8e131a237 to your computer and use it in GitHub Desktop.
Save skinnyjames/3bc5b2bf171a098b657ab8d8e131a237 to your computer and use it in GitHub Desktop.
start of winole.cr
require "json"
ole = JSON.parse(File.read("./ole.json"))
def payload_to_pointers(payload, str = "")
if payload["Kind"] == "PointerTo"
str << "*"
return payload_to_pointers(payload["Child"], str)
elsif payload["Kind"] == "ApiRef"
str = str.split("").unshift(payload["Name"]).join("")
return str
elsif payload["Kind"] == "Native"
str = str.split("").unshift("LibC::#{payload["Name"]}").join("")
elsif payload["Kind"] == "Array"
str << "[]"
return payload_to_pointers(payload["Child"], str)
else
str.split("").unshift(payload["Kind"]).join("")
return str
end
end
def get_func_args(func)
params = func["Params"]
params.map do |p|
"#{p["Name"]} : #{payload_to_pointers(p["Type"])}"
end.join(", ")
end
io = StringIO.new
ole["Constants"].each do |constant|
io.puts "alias #{constant["Name"]} = #{payload_to_pointers(constant.fetch("Type", "Name"))}\n"
end
ole["Types"].each do |type|
if type["Kind"] == "Enum"
if type["Flag"]
io.puts "@[Flags]"
end
io.puts "enum #{type["Name"]} : #{type["IntegerBase"]}"
type["Values"].each do |enum_val|
io.puts " #{enum_val["Name"]} = #{enum_val["Value"]}"
end
io.puts "end\n"
elsif type["Kind"] == "Struct"
io.puts "struct #{type["Name"]}"
type["Fields"].each do |field|
io.puts " #{field["Name"]} : #{payload_to_pointers(field["Type"])}"
end
io.puts "end\n"
else
puts type["Kind"], "missing"
end
end
ole["Functions"].each do |func|
io.puts "fun #{func["Name"]}(#{get_func_args(func)}) : #{payload_to_pointers(func["ReturnType"])}"
end
File.write("test.cr", io.string)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment