public static ParsedMutation Parse(Mutation mutation) { List <AccountStatus> accountMutations = new List <AccountStatus>(); List <KeyValuePair <RecordKey, ByteString> > dataRecords = new List <KeyValuePair <RecordKey, ByteString> >(); foreach (Record record in mutation.Records) { // This is used for optimistic concurrency and does not participate in the validation if (record.Value == null) { continue; } try { RecordKey key = RecordKey.Parse(record.Key); switch (key.RecordType) { case RecordType.Account: accountMutations.Add(AccountStatus.FromRecord(key, record)); break; case RecordType.Data: dataRecords.Add(new KeyValuePair <RecordKey, ByteString>(key, record.Value)); break; } } catch (ArgumentOutOfRangeException ex) when(ex.ParamName == "keyData") { // Deserializing and re-serializing the record gives a different result throw new TransactionInvalidException("NonCanonicalSerialization"); } catch (ArgumentOutOfRangeException ex) when(ex.ParamName == "path") { // The path is invalid throw new TransactionInvalidException("InvalidPath"); } catch (ArgumentOutOfRangeException ex) when(ex.ParamName == "recordType") { // The specified record type is unknown throw new TransactionInvalidException("InvalidRecord"); } catch (ArgumentOutOfRangeException ex) when(ex.ParamName == "record") { // The value of an ACC record could not be deserialized throw new TransactionInvalidException("InvalidRecord"); } } return(new ParsedMutation(accountMutations, dataRecords)); }
public void FromRecord_Unset() { Record record = new Record( AccountKey.Parse("/the/account/", "/the/asset/").Key.ToBinary(), ByteString.Empty, binaryData[1]); AccountStatus status = AccountStatus.FromRecord(RecordKey.Parse(record.Key), record); Assert.Equal("/the/account/", status.AccountKey.Account.FullPath); Assert.Equal("/the/asset/", status.AccountKey.Asset.FullPath); Assert.Equal(0, status.Balance); Assert.Equal(binaryData[1], status.Version); }
public void FromRecord_Set() { Record record = new Record( AccountKey.Parse("/the/account/", "/the/asset/").Key.ToBinary(), SerializeInt(100), binaryData[1]); AccountStatus status = AccountStatus.FromRecord(RecordKey.Parse(record.Key), record); Assert.Equal("/the/account/", status.AccountKey.Account.FullPath); Assert.Equal("/the/asset/", status.AccountKey.Asset.FullPath); Assert.Equal(100, status.Balance); Assert.Equal(binaryData[1], status.Version); }
public void FromRecord_InvalidRecordType() { RecordKey key = new RecordKey(RecordType.Data, LedgerPath.Parse("/path/"), "name"); Record record = new Record(key.ToBinary(), ByteString.Empty, binaryData[1]); ArgumentOutOfRangeException exception = Assert.Throws <ArgumentOutOfRangeException>(() => AccountStatus.FromRecord(key, record)); Assert.Equal("key", exception.ParamName); }