anchor.diff:  
   do_parse_config(unquote, Val) ->
       case nklib_parse:unquote(Val) of
  +        error -> error;
  +        Bin -> {ok, Bin}
  +    end;
  +
  +do_parse_config(path, Val) ->
  +    case nklib_parse:path(Val) of
           error -> error;
           Bin -> {ok, Bin}
       end;
  
positive.code: parse_config([], Opts1, Opts2, _Spec) ->
      {ok, lists:reverse(Opts1), lists:reverse(Opts2)};
  
  parse_config([{Key, Val}|Rest], Opts1, Opts2, Spec) when is_atom(Key) ->
      case maps:get(Key, Spec, not_found) of
          not_found ->
              parse_config(Rest, Opts1, [{Key, Val}|Opts2], Spec);
          {'fun', Fun} ->
              case catch Fun(Key, Val, Opts1) of
                  ok ->
                      parse_config(Rest, [{Key, Val}|Opts1], Opts2, Spec);
                  {ok, Val1} ->
                      parse_config(Rest, [{Key, Val1}|Opts1], Opts2, Spec);
                  {opts, Opts1B} ->
                      parse_config(Rest, Opts1B, Opts2, Spec);
                  error ->
                      throw({invalid_key, Key})
              end;
          KeySpec ->
              case do_parse_config(KeySpec, Val) of
                  {ok, Val1} ->
                      parse_config(Rest, [{Key, Val1}|Opts1], Opts2, Spec);
                  error ->
                      throw({invalid_key, Key})
              end
      end;
  
  parse_config([{Key, Val}|Rest], Opts1, Opts2, Spec) ->
      parse_config([{to_atom(Key), Val}|Rest], Opts1, Opts2, Spec);
      
  parse_config([Key|Rest], Opts1, Opts2, Spec) ->
      parse_config([{Key, true}|Rest], Opts1, Opts2, Spec).
  
  
  %% @private
  
negative.code:     {integer, [integer()]} | {record, atom()} |
      string | binary | lower | upper |
      ip | host | host6 | {function, pos_integer()} |
      unquote | path |
      fun((atom(), term(), [{atom(), term()}]) -> 
              ok | {ok, term()} | {opts, [{atom(), term()}]} | error).
  
  -type parse_spec() :: #{ atom() => parse_opt()}.
  
  