Adding support to <%BHL_REF(..)%> macro for .local/_Local overrides

This commit is contained in:
Pavel Shevaev 2023-05-30 16:34:59 +03:00
parent 852b90dc7a
commit 4c32ed0d08
3 changed files with 28 additions and 12 deletions

View File

@ -214,18 +214,16 @@ function bhl_map_module_to_file($module)
return null; return null;
} }
function bhl_validate_func_ref($module, $func, array $signature) function bhl_validate_func_ref($module_file, $func, array $signature)
{ {
if(sizeof($signature) == 0) if(sizeof($signature) == 0)
throw new Exception("Signature is invalid"); throw new Exception("Signature is invalid");
$module_file = bhl_map_module_to_file($module);
if(!$module_file)
throw new Exception("Module not found '{$module}'");
$module_src = file_get_contents($module_file); $module_src = file_get_contents($module_file);
if(!$module_src)
throw new Exception("Bad module file '{$module_file}'");
$signature_pattern = ''; $signature_pattern = '';
$signature_pattern .= '~func\s+'; $signature_pattern .= '~func\s+';
if($signature[0] !== 'void') if($signature[0] !== 'void')
@ -248,7 +246,7 @@ function bhl_validate_func_ref($module, $func, array $signature)
$signature_pattern .= '~'; $signature_pattern .= '~';
if(!preg_match($signature_pattern, $module_src)) if(!preg_match($signature_pattern, $module_src))
throw new Exception("Func '$func' signature '".implode(',', $signature)."' not found in module '$module'"); throw new Exception("Func '$func' signature '".implode(',', $signature)."' not found in module '$module_file'");
} }
function bhl_upm_path() function bhl_upm_path()

View File

@ -10,6 +10,10 @@ function flt_bhl_ref($val, $name, $struct, $args)
if(!isset($val['module'])) if(!isset($val['module']))
throw new Exception("Missing 'module'"); throw new Exception("Missing 'module'");
$module_file = \taskman\bhl_map_module_to_file($val['module']);
if(!$module_file)
throw new Exception("Module not found '{$val['module']}");
if(!isset($val['fn'])) if(!isset($val['fn']))
throw new Exception("Missing 'fn'"); throw new Exception("Missing 'fn'");
@ -17,7 +21,7 @@ function flt_bhl_ref($val, $name, $struct, $args)
if(!$signature) if(!$signature)
throw new Exception("Invalid signature: $args"); throw new Exception("Invalid signature: $args");
\taskman\bhl_validate_func_ref($val['module'], $val['fn'], $signature); \taskman\bhl_validate_func_ref($module_file, $val['fn'], $signature);
return $val; return $val;
} }

View File

@ -3,17 +3,31 @@
/** /**
* @global * @global
*/ */
function macro_BHL_REF($proc, $mod_name, $func, $signature_json = '') function macro_BHL_REF($proc, $module, $func, $signature_json = '')
{ {
//let's try the .local override first
$module_file = \taskman\bhl_map_module_to_file($module.".local");
if($module_file)
{
$module .= '.local';
$func .= '_Local';
}
else
{
$module_file = \taskman\bhl_map_module_to_file($module);
if(!$module_file)
throw new Exception("Module not found '{$module}'");
}
//validate signature only if it's explicitely passed //validate signature only if it's explicitely passed
if($signature_json) if($signature_json)
{ {
$signature = json_decode($signature_json, false); $signature = json_decode($signature_json, false);
if(!is_array($signature)) if(!is_array($signature))
throw new Exception("Signature is invalid '$mod_name'"); throw new Exception("Signature is invalid '$module'");
\taskman\bhl_validate_func_ref($mod_name, $func, $signature); \taskman\bhl_validate_func_ref($module_file, $func, $signature);
} }
return array('module' => ltrim($mod_name, '/'), 'fn' => $func); return array('module' => ltrim($module, '/'), 'fn' => $func);
} }