Skip to content
This repository has been archived by the owner on Jul 20, 2020. It is now read-only.

Commit

Permalink
made Link.ToString a valid string
Browse files Browse the repository at this point in the history
  • Loading branch information
jchannon committed Apr 25, 2016
1 parent 1f4e735 commit e6759aa
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 91 deletions.
1 change: 1 addition & 0 deletions src/Nancy.Hal.Example/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ static void Main()
using (var host = new NancyHost(new Uri("http://localhost:1234")))
{
host.Start();
Console.WriteLine("Server running on http://localhost:1234");
Console.ReadLine();
}
}
Expand Down
185 changes: 97 additions & 88 deletions src/Nancy.Hal/Link.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,37 @@
using System.Collections.Generic;
using System.Text.RegularExpressions;

using Nancy.Hal.Configuration;

namespace Nancy.Hal
{
public class Link : IEquatable<Link>
{
private static readonly Regex IsTemplatedRegex = new Regex(@"{.+}", RegexOptions.Compiled);

public Link()
{}

public Link(string rel, string href, string title = null)
using Nancy.Hal.Configuration;

namespace Nancy.Hal
{
public class Link : IEquatable<Link>
{
private static readonly Regex IsTemplatedRegex = new Regex(@"{.+}", RegexOptions.Compiled);

public Link()
{
Rel = rel;
Href = href;
Title = title;
}

public string Rel { get; private set; }

public string Href { get; private set; }

public string Title { get; private set; }

public bool IsTemplated
{
get
{
return !string.IsNullOrEmpty(Href) && IsTemplatedRegex.IsMatch(Href);
}

public Link(string rel, string href, string title = null)
{
Rel = rel;
Href = href;
Title = title;
}

public string Rel { get; private set; }

public string Href { get; private set; }

public string Title { get; private set; }

public bool IsTemplated
{
get
{
return !string.IsNullOrEmpty(Href) && IsTemplatedRegex.IsMatch(Href);
}
}

/// <summary>
Expand Down Expand Up @@ -84,66 +85,74 @@ private Uri CreateUri(params object[] parameters)
return new Uri(SubstituteParams(Href, parameters), UriKind.RelativeOrAbsolute);
}

private static string SubstituteParams(string href, params object[] parameters)
{
var uriTemplate = new UriTemplate(href);
foreach (var parameter in parameters)
{
var dictionary = parameter as IDictionary<string, object>; //should work for ExpandoObject, DynamicDictionary, etc
if (dictionary != null)
{
foreach (var substitution in dictionary.Keys)
{
var name = substitution.ToCamelCaseString();
var value = dictionary[substitution];
var substituionValue = value == null ? null : value.ToString();
uriTemplate.SetParameter(name, substituionValue);
}
}
else
{
foreach (var substitution in parameter.GetType().GetProperties())
{
var name = substitution.Name.ToCamelCaseString();
var value = substitution.GetValue(parameter, null);
var substituionValue = value == null ? null : value.ToString();
uriTemplate.SetParameter(name, substituionValue);
}
}
}

return uriTemplate.Resolve();
}

public bool Equals(Link other)
{
return string.Compare(Href, other.Href, StringComparison.OrdinalIgnoreCase) == 0 &&
string.Compare(Rel, other.Rel, StringComparison.OrdinalIgnoreCase) == 0;
}

public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != GetType()) return false;
return Equals((Link)obj);
}

public override int GetHashCode()
{
var str = (string.IsNullOrEmpty(Rel) ? "norel" : Rel) + "~" + (string.IsNullOrEmpty(Href) ? "nohref" : Href);
var h = str.GetHashCode();
return h;
}

public static bool operator ==(Link left, Link right)
{
return Equals(left, right);
}

public static bool operator !=(Link left, Link right)
private static string SubstituteParams(string href, params object[] parameters)
{
var uriTemplate = new UriTemplate(href);
foreach (var parameter in parameters)
{
var dictionary = parameter as IDictionary<string, object>; //should work for ExpandoObject, DynamicDictionary, etc
if (dictionary != null)
{
foreach (var substitution in dictionary.Keys)
{
var name = substitution.ToCamelCaseString();
var value = dictionary[substitution];
var substituionValue = value == null ? null : value.ToString();
uriTemplate.SetParameter(name, substituionValue);
}
}
else
{
foreach (var substitution in parameter.GetType().GetProperties())
{
var name = substitution.Name.ToCamelCaseString();
var value = substitution.GetValue(parameter, null);
var substituionValue = value == null ? null : value.ToString();
uriTemplate.SetParameter(name, substituionValue);
}
}
}

return uriTemplate.Resolve();
}

public bool Equals(Link other)
{
return string.Compare(Href, other.Href, StringComparison.OrdinalIgnoreCase) == 0 &&
string.Compare(Rel, other.Rel, StringComparison.OrdinalIgnoreCase) == 0;
}

public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
return false;
if (ReferenceEquals(this, obj))
return true;
if (obj.GetType() != GetType())
return false;
return Equals((Link)obj);
}

public override int GetHashCode()
{
var str = (string.IsNullOrEmpty(Rel) ? "norel" : Rel) + "~" + (string.IsNullOrEmpty(Href) ? "nohref" : Href);
var h = str.GetHashCode();
return h;
}

public static bool operator ==(Link left, Link right)
{
return Equals(left, right);
}

public static bool operator !=(Link left, Link right)
{
return !Equals(left, right);
}

public override string ToString()
{
return !Equals(left, right);
return string.Format("Rel={0}, Href={1}", Rel, Href);
}
}
}
}
8 changes: 5 additions & 3 deletions src/Nancy.Hal/Processors/HalJsonResponseProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,13 @@ private static dynamic BuildDynamicLink(Link link)
{
dynamic dynamicLink = new ExpandoObject();
dynamicLink.href = link.Href;
if (link.IsTemplated) dynamicLink.templated = true;
if (!string.IsNullOrEmpty(link.Title)) dynamicLink.title = link.Title;
if (link.IsTemplated)
dynamicLink.templated = true;
if (!string.IsNullOrEmpty(link.Title))
dynamicLink.title = link.Title;
return dynamicLink;
}

public IEnumerable<Tuple<string, MediaRange>> ExtensionMappings { get { return Enumerable.Empty <Tuple<string, MediaRange>>(); } }
}
}
}

0 comments on commit e6759aa

Please sign in to comment.