scala kafka
via PatrickJS/awesome-cursorrules
Scala development practices for Kafka applications with clean code and functional patterns.
What is scala kafka?
This rule establishes coding standards for Scala Kafka projects, covering functional programming principles, error handling, testing, and build practices. Use it to maintain consistency across Kafka stream processing code and ensure adherence to SOLID principles and modern Scala 3 idioms.
- Enforce immutable collections, pure functions, and explicit side-effect handling (Try, Either, IO)
- Require exhaustive pattern matching, case classes, and sealed traits for type safety
- Mandate scalafmt formatting with 100-character line limits and Google-inspired configuration
- Specify Kafka-specific practices: externalize topic names to config, use Format/Codec libraries, test with TopologyTestDriver
- Establish naming conventions (UpperCamelCase classes, lowerCamelCase methods, SCREAMING_SNAKE_CASE constants)
- Require SLF4J logging via scala-logging, proper exception handling, and resource management with scala.util.Using
Applies to
File patterns this rule matches.
Rule definition (reference)
Source of truth, from the repository.
general-scala-clean-code.mdc
- Declare vals/vars as close as possible to first use.
- Name length should be proportional to scope: 1-2 chars allowed only inside small lambdas.
- Avoid nested for-comprehensions deeper than two levels; factor out steps into helpers.
- Split a single source file by responsibility.
- Use tail-rec optimisation (
@tailrec) where appropriate. - Prefer immutable collections and avoid mutation during iteration.
- When interop with Java forces mutability, wrap it in a pure facade with the use of .asScala, to retain functional API.
- When something is nullable, wrap it into an Option, to retain functional API.
- Keep cyclomatic complexity below 10 for any method; IDE inspections should warn.
general-scala-development-practices.mdc
========== GENERAL PRINCIPLES ==========
- You are an experienced Senior Scala Developer.
- You always adhere to SOLID, DRY, KISS and YAGNI principles.
- Prefer pure functions; minimise side-effects. Where effects are required, make them explicit (e.g. using scala.util.Try, Either, or cats-effect IO/Task if adopted).
- Use val over var; collections must be immutable unless mutability is proven cheaper & safe.
- Replace null with Option, Either or a domain-specific ADT.
- Use pattern matching exhaustively and handle the default case only when truly open-ended.
- Prefer for-comprehensions, map/flatMap/fold, and higher-order functions over imperative loops.
- Prefer case classes and sealed traits for algebraic data types.
- Extract common logic into private or package-private helpers; avoid long methods (> 30 LOC).
- Prefer extension methods or type classes over inheritance when adding behaviour.
- Keep public APIs small, surface only what the module owns.
- Break every task into the smallest composable pure functions before wiring them together.
========== NAMING & SYNTAX ==========
- Class / object / trait names are UpperCamelCase nouns (e.g. NotificationStreamApp).
- Methods & vals are lowerCamelCase verbs or nouns (e.g. process, serde, productKey).
- Constants use
SCREAMING_SNAKE_CASE. - Similar to Java’s static final members, if the member is final, immutable and it belongs to a package object or an object, it may be considered a constant.
- Symbolic names (
|>) are allowed only when they align with widespread FP idioms. - Match expressions use
match/caseover nested if/else chains; for simple two-branch logic preferif … then … else …expressions.
========== ERROR HANDLING & LOGGING ==========
- Catch the most specific Exception first; convert checked Java exceptions to an ADT or
Try. - No empty
catchblocks; log at debug or error level with a meaningful message. - Leverage
scala.util.Using(or cats-effectResource) for auto-closing resources. - Avoid “defensive” logging or
println; use SLF4J (Logback) with the scala-logging wrapper.
========== TESTING ==========
- Use ScalaTest in a Given-When-Then layout with the use of AnyFlatSpec.
- Focus on critical paths and business invariants; do not over-test boilerplate.
- Property-based tests (ScalaCheck) for pure functions with non-trivial invariants.
- Set up integration tests as a subproject named “integration” and treat integration tests as standard tests
========== PERFORMANCE & SAFETY ==========
- Avoid blocking calls inside Kafka stream processing; if unavoidable, off-load to a dedicated thread-pool.
- Convert Java collections to Scala equivalents once at the boundary; never bounce back and forth.
- Use underscore-separated digits for large numeric literals (e.g.
val timeoutMs = 30_000).
========== MODERN SCALA 3 FEATURES ==========
- Use Enums for finite alternatives instead of Java-style enums.
- Embrace opaque types to avoid accidental misuse of primitive wrappers.
- Use context parameters (
using) for type-class evidence instead of classic implicit lists when convenient. - Prefer
given/usingsyntax overimplicitwhere supported.
========== CLEAN BUILD ==========
- The sbt build uses scalafmt for formatting; treat any scalafmt violation as a build error.
kafka-development-practices.mdc
- All topic names config values (Typesafe Config or pure-config).
- Use Format or Codec from the JSON or AVRO or another library that is being used in the project.
- Streams logic must be tested with
TopologyTestDriver(unit-test) plus an integration test against local Kafka.
linting-formatting.mdc
- scalafmt: Enforce Google-inspired scalafmt configuration with
maxColumn = 100.
Related rules
Senior full-stack TypeScript, React, Node.js guidance with clean architecture, testing, and WHY-oriented reasoning.
Quantitative factor research skills for designing, evaluating, and mining alpha factors in equities markets.
Android development with Jetpack Compose, clean architecture, and Material Design 3.
Angular development with Novo Elements UI library using standalone components.
Expert Angular 18 + TypeScript development with Jest, emphasizing clean code and performance.
Manage Kubernetes clusters, add-ons, stacks, and credentials via the Ankra CLI platform.