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) => (
))}
))
)}
)
}