package com.ripple.core.types.known.tx.result;
import com.ripple.core.coretypes.STArray;
import com.ripple.core.coretypes.STObject;
import com.ripple.core.coretypes.uint.UInt32;
import com.ripple.core.coretypes.uint.UInt8;
import com.ripple.core.serialized.enums.EngineResult;
import com.ripple.core.types.known.sle.LedgerEntry;
import java.util.Iterator;
public class TransactionMeta extends STObject {
public static boolean isTransactionMeta(STObject source) {
return source.has(UInt8.TransactionResult) &&
source.has(STArray.AffectedNodes);
}
public EngineResult engineResult() {
return engineResult(this);
}
public Iterable<AffectedNode> affectedNodes() {
STArray nodes = get(STArray.AffectedNodes);
final Iterator<STObject> iterator = nodes.iterator();
return new Iterable<AffectedNode>() {
@Override
public Iterator<AffectedNode> iterator() {
return iterateAffectedNodes(iterator);
}
};
}
public void walkPrevious(LedgerEntry.OnLedgerEntry cb) {
for (AffectedNode affectedNode : affectedNodes()) {
if (affectedNode.wasPreviousNode()) {
cb.onObject(affectedNode.nodeAsPrevious());
}
}
}
public void walkFinal(LedgerEntry.OnLedgerEntry cb) {
for (AffectedNode affectedNode : affectedNodes()) {
if (affectedNode.isFinalNode()) {
cb.onObject(affectedNode.nodeAsPrevious());
}
}
}
public static Iterator<AffectedNode> iterateAffectedNodes(final Iterator<STObject> iterator) {
return new Iterator<AffectedNode>() {
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public AffectedNode next() {
return (AffectedNode) iterator.next();
}
@Override
public void remove() {
iterator.remove();
}
};
}
public UInt32 transactionIndex() {
return get(UInt32.TransactionIndex);
}
}