/// <inheritdoc /> public IUriComponents GetUriComponents(string uriString, RESTableContext context) { var uri = new DefaultProtocolUriComponents(this); var match = Regex.Match(uriString, RegEx.RESTableRequestUri); if (!match.Success) { throw new InvalidSyntax(ErrorCodes.InvalidUriSyntax, "Check URI syntax"); } var resourceOrMacro = match.Groups["res"].Value.TrimStart('/'); var view = match.Groups["view"].Value.TrimStart('-'); var conditions = match.Groups["cond"].Value.TrimStart('/'); var metaConditions = match.Groups["meta"].Value.TrimStart('/'); switch (conditions) { case string { Length: 0 } : case "_": break; default: { foreach (var uriCondition in ParseUriConditions(conditions, true)) { uri.Conditions.Add(uriCondition); } break; } } switch (metaConditions) { case string { Length: 0 } : case "_": break; default: { foreach (var uriCondition in ParseUriConditions(metaConditions, true)) { uri.MetaConditions.Add(uriCondition); } break; } } if (view.Length != 0) { uri.ViewName = view; } switch (resourceOrMacro) { case "": case "_": uri.ResourceSpecifier = context.WebSocket?.Status == WebSocketStatus.Waiting ? ResourceCollection.GetResourceSpecifier <Shell>() : ResourceCollection.GetResourceSpecifier <AvailableResource>(); break; case var resource when resourceOrMacro[0] != '$': uri.ResourceSpecifier = resource; break; case var _macro when _macro.Substring(1) is string _: throw new MacrosNotSupported(); } return(uri); }