Created
May 9, 2023 14:57
-
-
Save skinnyjames/3bc5b2bf171a098b657ab8d8e131a237 to your computer and use it in GitHub Desktop.
start of winole.cr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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