Languages .mdc

Scala Kafka

Cursor rules for Scala Kafka.

Nasıl kullanılır
  1. Kural içeriğini kopyala.
  2. Projenin root klasöründe şu dosyayı oluştur: .cursorrules veya .cursor/rules/scala-kafka.mdc
  3. İçeriği yapıştır ve kaydet.

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/case over nested if/else chains; for simple two-branch logic prefer if … then … else … expressions.

========== ERROR HANDLING & LOGGING ==========

  • Catch the most specific Exception first; convert checked Java exceptions to an ADT or Try.
  • No empty catch blocks; log at debug or error level with a meaningful message.
  • Leverage scala.util.Using (or cats-effect Resource) 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/using syntax over implicit where 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.

Benzer kurallar

Daha fazla: Languages →