---
name: add-ktnip-parameter-strategy
description: Adds a new parameter resolution strategy to the ktnip KSP processor. Use when handler functions need to receive a new parameter type (e.g. ChatMember, InlineQuery), or when adding support for a new resolvable type in Activity invocation.
---

# Add Ktnip Parameter Strategy

## Workflow

### 1. Add ParameterResolutionStrategy

- In [ParameterResolutionStrategy.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/dto/ParameterResolutionStrategy.kt)
- Add new `data class` extending `ParameterResolutionStrategy`
- Include `typeName`, `isNullable`; add strategy-specific fields (e.g. `parameterName`, `updateTypeSimpleName`)

```kotlin
data class MyParam(
    override val typeName: TypeName,
    override val isNullable: Boolean,
    val myField: String,
) : ParameterResolutionStrategy()
```

### 2. Add TypeConstant (if new type)

- In [TypeConstants.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/utils/TypeConstants.kt)
- Add `val myTypeClass: TypeName = MyType::class.asTypeName()`

### 3. Update ParameterResolver

- In [ParameterResolver.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/codegen/ParameterResolver.kt)
- Add branch in `resolve()` when block:
  - Match `typeName` (use TypeConstants or `in TypeMapper.getAllTypedUpdateTypes()` for typed updates)
  - Return new strategy instance
  - Handle `@ParamMapping` for parameter name if from parameters map

### 4. Update InvocationCodeGenerator

- In [InvocationCodeGenerator.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/codegen/InvocationCodeGenerator.kt)
- Add branch in `generateParameterResolution()` when block
- Generate CodeBlock: `CodeBlock.of("val param%L = ...\n", parameterIndex, ...)`
- Add imports via `fileBuilder.addImport(...)` if needed
- Use `nullabilityMark` for `!!` when non-null

### 5. Update generateInvocationCode (if needed)

- If strategy affects `isBotNeeded`, `isUpdateNeeded`, `isParametersNeeded`, `isUserNeeded`: add to the `strategies.any { ... }` checks

## Reference

- [ParameterResolutionStrategy.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/dto/ParameterResolutionStrategy.kt)
- [ParameterResolver.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/codegen/ParameterResolver.kt)
- [InvocationCodeGenerator.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/codegen/InvocationCodeGenerator.kt)
- [TypeMapper.kt](ktnip/src/jvmMain/kotlin/eu/vendeli/ktnip/codegen/TypeMapper.kt) - for TypedUpdate: add to updateTypeMap
