<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def set_weather_from_metar( metar: typing.Union[Metar.Metar, str], in_file: typing.Union[str, Path], out_file: typing.Union[str, Path] = None ) -> typing.Tuple[typing.Union[str, None], typing.Union[str, None]]: """ Applies the weather from a METAR object to a MIZ file Args: metar: metar object in_file: path to MIZ file out_file: path to output MIZ file (will default to in_file) Returns: tuple of error, success """

    error, metar = custom_metar.CustomMetar.get_metar(metar)

    if error:
        return error, None

    if metar:
        LOGGER.debug('METAR: %s', metar.code)

    in_file = elib.path.ensure_file(in_file)

    if out_file is None:
        out_file = in_file
    else:
        out_file = elib.path.ensure_file(out_file, must_exist=False)
    LOGGER.debug('applying metar: %s -> %s', in_file, out_file)

    try:
        LOGGER.debug('building MissionWeather')
        _mission_weather = mission_weather.MissionWeather(metar)

        with Miz(str(in_file)) as miz:
            _mission_weather.apply_to_miz(miz)
            miz.zip(str(out_file))
            return None, f'successfully applied METAR to {in_file}'

    except ValueError:
        error = f'Unable to apply METAR string to the mission.\n' \
                f'This is most likely due to a freak value, this feature is still experimental.\n' \
                f'I will fix it ASAP !'
        return error, None