import React from 'react' import type { Explain } from '../../core/explain' import { ArrowRight, ChevronDown, ChevronRight } from '../components/icons' import { Badge } from '../components/ui' import { formatAttrValue, summarizeTrace } from '../lib/format' function LeafNode({ leaf }: { leaf: Explain.ILeafTrace }) { return (
{leaf.result ? 'PASS' : 'FAIL'} {leaf.field} {leaf.operator}
expected: {formatAttrValue(leaf.expected)}
actual:{' '} {formatAttrValue(leaf.actual)}
) } function GroupNode({ group, depth = 0 }: { group: Explain.IGroupTrace; depth?: number }) { const [open, setOpen] = React.useState(depth < 2) return (
{open && (
{group.children.map((child) => child.type === 'condition' ? ( ) : ( ), )}
)}
) } function RuleTrace({ rule }: { rule: Explain.IRuleTrace }) { const [open, setOpen] = React.useState(rule.matched) return (
{open && (
)}
) } export function IamTraceTree({ result }: { result: Explain.IResult }) { return (
{result.decision.allowed ? 'ALLOWED' : 'DENIED'} {result.summary}
{result.policies.length === 0 ? (
no policies evaluated
) : ( result.policies.map((p) => (
{p.policyName ?? p.policyId} target {p.result} {p.algorithm} {p.decidingRuleId && ( {p.decidingRuleId} )} {p.reason}
{p.rules.map((r) => ( ))}
)) )}
) }