/// <inheritdoc /> public string MakeRelativeUri(IUriComponents components) { var hasFilter = components.Conditions.Any(); var hasOther = components.MetaConditions.Any(); using (var b = new StringWriter()) { b.Write('/'); b.Write(components.ResourceSpecifier); if (hasFilter || hasOther) { b.Write('?'); if (hasFilter) { b.Write("$filter="); var conds = components.Conditions.Select(c => $"{c.Key} {GetOperatorString(c.Operator)} {c.ValueLiteral}"); b.Write(string.Join(" and ", conds)); } if (hasOther) { if (hasFilter) { b.Write("&"); } var conds = components.MetaConditions.Select(c => c.Key switch { "order_asc" => $"$orderby={c.ValueLiteral} asc", "order_desc" => $"$orderby={c.ValueLiteral} desc", "select" => $"$select={c.ValueLiteral}", "offset" => $"$skip={c.ValueLiteral}", "limit" => $"$top={c.ValueLiteral}", "search" => $"$search={c.ValueLiteral}", _ => "" });
private void Populate(IUriComponents components) { ResourceSpecifier = components.ResourceSpecifier; ViewName = components.ViewName; Conditions = components.Conditions; MetaConditions = components.MetaConditions; Macro = components.Macro; }
internal UriComponents(IUriComponents existing) { ProtocolIdentifier = existing.ProtocolIdentifier; ResourceSpecifier = existing.ResourceSpecifier; ViewName = existing.ViewName; Conditions = existing.Conditions.ToList(); MetaConditions = existing.MetaConditions.ToList(); Macro = existing.Macro; }
private static string ToUriString(IUriComponents components) { var view = components.ViewName != null ? $"-{components.ViewName}" : null; var resource = components.Macro == null ? $"/{components.ResourceSpecifier}{view}" : $"/${components.Macro.Name}"; var str = new StringBuilder(resource); if (components.Conditions.Count > 0) { str.Append($"/{ToUriString(components.Conditions)}"); if (components.MetaConditions.Count > 0) { str.Append($"/{UnescapeMetaconditions(ToUriString(components.MetaConditions))}"); } } else if (components.MetaConditions.Count > 0) { str.Append($"/_/{UnescapeMetaconditions(ToUriString(components.MetaConditions))}"); } return(str.ToString()); }
/// <inheritdoc /> public string MakeRelativeUri(IUriComponents components) => ToUriString(components);