Skip to content

Commit

Permalink
feat: ToString "G" and "L"
Browse files Browse the repository at this point in the history
BREAKING CHANGE: The default was "L", it is now "G".
  • Loading branch information
richardschneider committed Jun 15, 2019
1 parent 8e0626e commit 7baa55b
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 20 deletions.
84 changes: 67 additions & 17 deletions src/Cid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,28 +184,78 @@ public MultiHash Hash
}

/// <summary>
/// A CID that is readable by a human.
/// Returns the string representation of the CID in the
/// general format.
/// </summary>
/// <returns>
/// e.g. "base58btc cidv0 dag-pb sha2-256 Qm..."
/// e.g. "QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V"
/// </returns>
public override string ToString()
{
var sb = new StringBuilder();
sb.Append(Encoding);
sb.Append(' ');
sb.Append("cidv");
sb.Append(Version);
sb.Append(' ');
sb.Append(ContentType);
if (Hash != null)
{
sb.Append(' ');
sb.Append(Hash.Algorithm.Name);
sb.Append(' ');
sb.Append(MultiBase.Encode(Hash.ToArray(), Encoding).Substring(1));
}
return sb.ToString();
return ToString("G");
}

/// <summary>
/// Returns a string representation of the CID
/// according to the provided format specifier.
/// </summary>
/// <param name="format">
/// A single format specifier that indicates how to format the value of the
/// CID. Can be "G" or "L".
/// </param>
/// <returns>
/// The CID in the specified <paramref name="format"/>.
/// </returns>
/// <exception cref="FormatException">
/// <paramref name="format"/> is not valid.
/// </exception>
/// <remarks>
/// <para>
/// The "G" format specifier is the same as calling <see cref="Encode"/>.
/// </para>
/// <list type="table">
/// <listheader>
/// <term>Specifier</term>
/// <description>return value</description>
/// </listheader>
/// <item>
/// <term>G</term>
/// <description>QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V</description>
/// </item>
/// <item>
/// <term>L</term>
/// <description>base58btc cidv0 dag-pb sha2-256 Qm...</description>
/// </item>
/// </list>
/// </remarks>
public string ToString(string format)
{
switch (format)
{
case "G":
return Encode();

case "L":
var sb = new StringBuilder();
sb.Append(Encoding);
sb.Append(' ');
sb.Append("cidv");
sb.Append(Version);
sb.Append(' ');
sb.Append(ContentType);
if (Hash != null)
{
sb.Append(' ');
sb.Append(Hash.Algorithm.Name);
sb.Append(' ');
sb.Append(MultiBase.Encode(Hash.ToArray(), Encoding).Substring(1));
}
return sb.ToString();

default:
throw new FormatException($"Invalid CID format specifier '{format}'.");
}

}

/// <summary>
Expand Down
33 changes: 30 additions & 3 deletions test/CidTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,40 @@ namespace Ipfs
public class CidTest
{
[TestMethod]
public void HumanReadable()
public void ToString_Default()
{
var cid = new Cid { Hash = new MultiHash("QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V") };
Assert.AreEqual("base58btc cidv0 dag-pb sha2-256 QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V", cid.ToString());
Assert.AreEqual("QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V", cid.ToString());

cid = "zBunRGrmCGokA1oMESGGTfrtcMFsVA8aEtcNzM54akPWXF97uXCqTjF3GZ9v8YzxHrG66J8QhtPFWwZebRZ2zeUEELu67";
Assert.AreEqual("base58btc cidv1 dag-pb sha2-512 8Vx9QNCcSt39anEamkkSaNw5rDHQ7yuadq7ihZed477qQNXxYr3HReMamd1Q2EnUeL4oNtVAmNw1frEhEN1aoqFuKD", cid.ToString());
Assert.AreEqual("zBunRGrmCGokA1oMESGGTfrtcMFsVA8aEtcNzM54akPWXF97uXCqTjF3GZ9v8YzxHrG66J8QhtPFWwZebRZ2zeUEELu67", cid.ToString());
}

[TestMethod]
public void ToString_L()
{
var cid = new Cid { Hash = new MultiHash("QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V") };
Assert.AreEqual("base58btc cidv0 dag-pb sha2-256 QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V", cid.ToString("L"));

cid = "zBunRGrmCGokA1oMESGGTfrtcMFsVA8aEtcNzM54akPWXF97uXCqTjF3GZ9v8YzxHrG66J8QhtPFWwZebRZ2zeUEELu67";
Assert.AreEqual("base58btc cidv1 dag-pb sha2-512 8Vx9QNCcSt39anEamkkSaNw5rDHQ7yuadq7ihZed477qQNXxYr3HReMamd1Q2EnUeL4oNtVAmNw1frEhEN1aoqFuKD", cid.ToString("L"));
}

[TestMethod]
public void ToString_G()
{
var cid = new Cid { Hash = new MultiHash("QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V") };
Assert.AreEqual("QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V", cid.ToString("G"));

cid = "zBunRGrmCGokA1oMESGGTfrtcMFsVA8aEtcNzM54akPWXF97uXCqTjF3GZ9v8YzxHrG66J8QhtPFWwZebRZ2zeUEELu67";
Assert.AreEqual("zBunRGrmCGokA1oMESGGTfrtcMFsVA8aEtcNzM54akPWXF97uXCqTjF3GZ9v8YzxHrG66J8QhtPFWwZebRZ2zeUEELu67", cid.ToString("G"));
}

[TestMethod]
public void ToString_InvalidFormat()
{
var cid = new Cid { Hash = new MultiHash("QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V") };
ExceptionAssert.Throws<FormatException>(() => cid.ToString("?"));
}

[TestMethod]
Expand Down

0 comments on commit 7baa55b

Please sign in to comment.