## vim: filetype=makopython

    @classmethod
    def for_project(cls, project_file, scenario_vars=None):
        ${py_doc('libadalang.create_project_unit_provider', 8)}

        if scenario_vars:
            items = scenario_vars.items()
            scn_vars_array_type = _project_scenario_variable * (len(items) + 1)
            scn_vars_array = scn_vars_array_type()
            for i, (name, value) in enumerate(items):
                scn_vars_array[i] = _project_scenario_variable(name, value)
            scn_vars_array[-1] = _project_scenario_variable(None, None)
        else:
            scn_vars_array = None

        c_value = _create_project_unit_provider(
            project_file,
            scn_vars_array
        )
        if c_value:
            return cls(c_value)
        else:
            raise InvalidProjectError(
                'Cannot open project {}'.format(project_file)
            )

    @classmethod
    def auto(cls, input_files, charset=None):
        ${py_doc('libadalang.create_auto_provider', 8)}

        # Create a NULL-terminated array of strings
        c_strings = [ctypes.c_char_p(f) for f in input_files]
        c_array_type = ctypes.c_char_p * (len(input_files) + 1)
        c_array = c_array_type()
        for i, c_str in enumerate(c_strings):
            c_array[i] = c_str
        c_array[-1] = None

        c_array_ptr = ctypes.pointer(c_array)
        input_files_arg = ctypes.cast(c_array_ptr,
                                      ctypes.POINTER(ctypes.c_char_p))
        c_value = _create_auto_provider(input_files_arg, charset)
        return cls(c_value)
