diff --git a/src/Cid.cs b/src/Cid.cs index 77bc306..b6e6fe2 100644 --- a/src/Cid.cs +++ b/src/Cid.cs @@ -184,28 +184,78 @@ public MultiHash Hash } /// - /// A CID that is readable by a human. + /// Returns the string representation of the CID in the + /// general format. /// /// - /// e.g. "base58btc cidv0 dag-pb sha2-256 Qm..." + /// e.g. "QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V" /// 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"); + } + + /// + /// Returns a string representation of the CID + /// according to the provided format specifier. + /// + /// + /// A single format specifier that indicates how to format the value of the + /// CID. Can be "G" or "L". + /// + /// + /// The CID in the specified . + /// + /// + /// is not valid. + /// + /// + /// + /// The "G" format specifier is the same as calling . + /// + /// + /// + /// Specifier + /// return value + /// + /// + /// G + /// QmXg9Pp2ytZ14xgmQjYEiHjVjMFXzCVVEcRTWJBmLgR39V + /// + /// + /// L + /// base58btc cidv0 dag-pb sha2-256 Qm... + /// + /// + /// + 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}'."); + } + } /// diff --git a/test/CidTest.cs b/test/CidTest.cs index 94ebceb..33feb0c 100644 --- a/test/CidTest.cs +++ b/test/CidTest.cs @@ -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(() => cid.ToString("?")); } [TestMethod]