function output_file = generate_function_signature_json(function_handle, options)
function_handle {isFunctionCallSignal}
options.output_dir = tempdir
function_name = func2str(function_handle);
if exist(function_name, 'file') ~= 2
error('Function %s does not exist or is not on the MATLAB path.', function_name);
if ~isfolder(options.output_dir)
error('Output %s dirctory does not exists.', options.output_dir);
function_info = functions(function_handle);
function_file = function_info.file;
function_signature = get_function_signature(function_file);
json_struct = struct( ...
'schema_version', '1.0.0', ...
function_name, function_signature);
json_text = jsonencode(json_struct, 'PrettyPrint', true);
json_text = strrep(json_text, 'schema_version', '_schemaVersion');
output_file_name = [function_name '_signature.json'];
output_file = fullfile(options.output_dir, output_file_name);
fid = fopen(output_file, 'w');
fwrite(fid, json_text, 'char');
function function_signature = get_function_signature(function_file)
fid = fopen(function_file, 'r');
error('Could not open function file %s.', function_file);
function_signature = struct( ...
if startsWith(strtrim(line), 'function')
signature = parse_function_signature(line);
function_signature.inputs = build_argument_struct(signature.Inputs);
function_signature.outputs = build_argument_struct(signature.Outputs);
function signature = parse_function_signature(line)
line = strtrim(strrep(line, 'function', ''));
parts = strsplit(line, '=');
outputs_part = strtrim(parts{1});
outputs_part = strrep(outputs_part, '[', '');
outputs_part = strrep(outputs_part, ']', '');
outputs_part = strrep(outputs_part, ' ', '');
outputs = strsplit(outputs_part, ',');
func_name_part = strtrim(parts{end});
func_name_parts = strsplit(func_name_part, '(');
func_name = strtrim(func_name_parts{1});
inputs_part = strtrim(func_name_parts{2});
inputs_part = strrep(inputs_part, ')', '');
inputs_part = strrep(inputs_part, ' ', '');
inputs = strsplit(inputs_part, ',');
signature.Name = func_name;
signature.Description = '';
signature.Inputs = inputs;
signature.Outputs = outputs;
signature.Attributes = struct('Inline', false, 'Extrinsic', false);
function arg_structs = build_argument_struct(args)
arg_struct.name = args{i};
arg_structs{end+1} = arg_struct;