diff --git a/.scalafmt.conf b/.scalafmt.conf index 6816ad7..7c6a597 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,23 +1,14 @@ version = 3.6.1 -project.git = true # only format files tracked by git -maxColumn = 120 runner.dialect = scala3 -align.openParenCallSite = false -align.openParenDefnSite = false -# setting 'align = more' tokens explicitly to work with other align options -align.tokens = [ - {code = "=", owner = "(Enumerator.Val|Defn.(Va(l|r)|Def|Type))"}, - {code = "{", owner = "Template"}, - {code = "}", owner = "Template"}, - {code = "->", owner = "Term.ApplyInfix"}, - {code = "<-", owner = "Enumerator.Generator"}, - {code = "=>", owner = "Case"}, - {code = "%", owner = "Term.ApplyInfix"}, - {code = "%%", owner = "Term.ApplyInfix"}, - {code = "%%%", owner = "Term.ApplyInfix"} -] +project.git = true +maxColumn = 120 +align.preset=most assumeStandardLibraryStripMargin = true rewrite.rules = [ PreferCurlyFors, - SortImports -] \ No newline at end of file + SortModifiers, + Imports +] +rewrite.imports.sort = scalastyle +rewrite.scala3.convertToNewSyntax = true +rewrite.scala3.removeOptionalBraces = true diff --git a/build.sbt b/build.sbt index fa4d3ca..3ad9944 100644 --- a/build.sbt +++ b/build.sbt @@ -1,3 +1,5 @@ +import org.scalafmt.sbt.ScalafmtPlugin + import scala.annotation.nowarn // General info @@ -15,6 +17,7 @@ ThisBuild / githubWorkflowPublishTargetBranches := Seq.empty lazy val commonSettings = Defaults.itSettings ++ headerSettings(Configurations.IntegrationTest) ++ + inConfig(IntegrationTest)(ScalafmtPlugin.scalafmtConfigSettings) ++ Seq( organization := "fr.davit", organizationName := "Michel Davit", diff --git a/fs2/src/it/scala/fr/davit/taxonomy/fs2/DnsClientItSpec.scala b/fs2/src/it/scala/fr/davit/taxonomy/fs2/DnsClientItSpec.scala index 659ffa4..b2584c2 100644 --- a/fs2/src/it/scala/fr/davit/taxonomy/fs2/DnsClientItSpec.scala +++ b/fs2/src/it/scala/fr/davit/taxonomy/fs2/DnsClientItSpec.scala @@ -16,8 +16,8 @@ package fr.davit.taxonomy.fs2 -import cats.effect._ -import com.comcast.ip4s.{Dns => _} +import cats.effect.* +import com.comcast.ip4s.Dns as _ import fr.davit.taxonomy.model.record.{DnsARecordData, DnsRecordClass, DnsRecordType, DnsResourceRecord} import fr.davit.taxonomy.model.{DnsMessage, DnsPacket, DnsQuestion, DnsType} import fr.davit.taxonomy.scodec.DnsCodec @@ -26,7 +26,7 @@ import munit.CatsEffectSuite import scodec.Codec import java.net.{Inet4Address, InetAddress, InetSocketAddress} -import scala.concurrent.duration._ +import scala.concurrent.duration.* class DnsClientItSpec extends CatsEffectSuite: @@ -40,7 +40,7 @@ class DnsClientItSpec extends CatsEffectSuite: val socketResource = Network[IO].openDatagramSocket() val response = socketResource.use(s => Dns.resolve(s, DnsPacket(quad9DnsServer, query))) - val ip = InetAddress.getByName("217.70.184.38").asInstanceOf[Inet4Address] + val ip = InetAddress.getByName("217.70.184.38").asInstanceOf[Inet4Address] val message = DnsMessage( query.header.copy(`type` = DnsType.Response, isRecursionAvailable = true), query.questions, diff --git a/fs2/src/main/scala/fr/davit/taxonomy/fs2/Dns.scala b/fs2/src/main/scala/fr/davit/taxonomy/fs2/Dns.scala index d1f623b..1db938f 100644 --- a/fs2/src/main/scala/fr/davit/taxonomy/fs2/Dns.scala +++ b/fs2/src/main/scala/fr/davit/taxonomy/fs2/Dns.scala @@ -36,8 +36,8 @@ object Dns: packet: DnsPacket )(using codec: Codec[DnsMessage]): F[DnsPacket] = for - data <- Sync[F].delay(codec.encode(packet.message).require) - address = SocketAddress.fromInetSocketAddress(packet.address) + data <- Sync[F].delay(codec.encode(packet.message).require) + address = SocketAddress.fromInetSocketAddress(packet.address) _ <- socket.write(Datagram(address, Chunk.byteVector(data.toByteVector))) response <- socket.read message <- Sync[F].delay(codec.decode(response.bytes.toByteVector.toBitVector).require.value) @@ -59,7 +59,7 @@ object Dns: )(using codec: Codec[DnsMessage]): Stream[F, DnsPacket] = for datagram <- socket.reads - message <- Stream - .chunk(datagram.bytes) - .through(StreamDecoder.once(codec).toPipeByte[F]) + message <- Stream + .chunk(datagram.bytes) + .through(StreamDecoder.once(codec).toPipeByte[F]) yield DnsPacket(datagram.remote.toInetSocketAddress, message) diff --git a/model/src/main/scala/fr/davit/taxonomy/model/DnsHeader.scala b/model/src/main/scala/fr/davit/taxonomy/model/DnsHeader.scala index ada8507..9cb9aee 100644 --- a/model/src/main/scala/fr/davit/taxonomy/model/DnsHeader.scala +++ b/model/src/main/scala/fr/davit/taxonomy/model/DnsHeader.scala @@ -30,7 +30,7 @@ final case class DnsHeader( ) enum DnsType(val code: Int): - case Query extends DnsType(0) + case Query extends DnsType(0) case Response extends DnsType(1) object DnsType: @@ -40,12 +40,12 @@ object DnsType: case _ => throw new IllegalArgumentException(s"Invalid dns type $code") enum DnsOpCode(val code: Int): - case StandardQuery extends DnsOpCode(0) - case InverseQuery extends DnsOpCode(1) - case ServerStatusRequest extends DnsOpCode(2) - case Notify extends DnsOpCode(4) - case Update extends DnsOpCode(5) - case DnsStatefulOperations extends DnsOpCode(6) + case StandardQuery extends DnsOpCode(0) + case InverseQuery extends DnsOpCode(1) + case ServerStatusRequest extends DnsOpCode(2) + case Notify extends DnsOpCode(4) + case Update extends DnsOpCode(5) + case DnsStatefulOperations extends DnsOpCode(6) case Unassigned(value: Int) extends DnsOpCode(value) object DnsOpCode: @@ -60,18 +60,18 @@ object DnsOpCode: case _ => throw new IllegalArgumentException(s"Invalid dns op code $code") enum DnsResponseCode(val code: Int): - case Success extends DnsResponseCode(0) - case FormatError extends DnsResponseCode(1) - case ServerFailure extends DnsResponseCode(2) - case NonExistentDomain extends DnsResponseCode(3) - case NotImplemented extends DnsResponseCode(4) - case Refused extends DnsResponseCode(5) - case ExtraDomain extends DnsResponseCode(6) - case ExtraRRSet extends DnsResponseCode(7) - case NonExistentRRSet extends DnsResponseCode(8) - case NotAuth extends DnsResponseCode(9) - case NotZone extends DnsResponseCode(10) - case DsoTypeNotImplemented extends DnsResponseCode(11) + case Success extends DnsResponseCode(0) + case FormatError extends DnsResponseCode(1) + case ServerFailure extends DnsResponseCode(2) + case NonExistentDomain extends DnsResponseCode(3) + case NotImplemented extends DnsResponseCode(4) + case Refused extends DnsResponseCode(5) + case ExtraDomain extends DnsResponseCode(6) + case ExtraRRSet extends DnsResponseCode(7) + case NonExistentRRSet extends DnsResponseCode(8) + case NotAuth extends DnsResponseCode(9) + case NotZone extends DnsResponseCode(10) + case DsoTypeNotImplemented extends DnsResponseCode(11) case Unassigned(value: Int) extends DnsResponseCode(value) object DnsResponseCode: diff --git a/model/src/main/scala/fr/davit/taxonomy/model/record/DnsRecordType.scala b/model/src/main/scala/fr/davit/taxonomy/model/record/DnsRecordType.scala index 9feedbc..9d27bd7 100644 --- a/model/src/main/scala/fr/davit/taxonomy/model/record/DnsRecordType.scala +++ b/model/src/main/scala/fr/davit/taxonomy/model/record/DnsRecordType.scala @@ -17,86 +17,86 @@ package fr.davit.taxonomy.model.record enum DnsRecordType(val code: Int): - case A extends DnsRecordType(1) - case NS extends DnsRecordType(2) - case MD extends DnsRecordType(3) - case MF extends DnsRecordType(4) - case CNAME extends DnsRecordType(5) - case SOA extends DnsRecordType(6) - case MB extends DnsRecordType(7) - case MG extends DnsRecordType(8) - case MR extends DnsRecordType(9) - case NULL extends DnsRecordType(10) - case WKS extends DnsRecordType(11) - case PTR extends DnsRecordType(12) - case HINFO extends DnsRecordType(13) - case MINFO extends DnsRecordType(14) - case MX extends DnsRecordType(15) - case TXT extends DnsRecordType(16) - case RP extends DnsRecordType(17) - case AFSDB extends DnsRecordType(18) - case X25 extends DnsRecordType(19) - case ISDN extends DnsRecordType(20) - case RT extends DnsRecordType(21) - case NSAP extends DnsRecordType(22) - case `NSAP-PTR` extends DnsRecordType(23) - case SIG extends DnsRecordType(24) - case KEY extends DnsRecordType(25) - case PX extends DnsRecordType(26) - case GPOS extends DnsRecordType(27) - case AAAA extends DnsRecordType(28) - case LOC extends DnsRecordType(29) - case NXT extends DnsRecordType(30) - case EID extends DnsRecordType(31) - case NIMLOC extends DnsRecordType(32) - case SRV extends DnsRecordType(33) - case ATMA extends DnsRecordType(34) - case NAPTR extends DnsRecordType(35) - case KX extends DnsRecordType(36) - case CERT extends DnsRecordType(37) - case A6 extends DnsRecordType(38) - case DNAME extends DnsRecordType(39) - case SINK extends DnsRecordType(40) - case OPT extends DnsRecordType(41) - case APL extends DnsRecordType(42) - case DS extends DnsRecordType(43) - case SSHFP extends DnsRecordType(44) - case IPSECKEY extends DnsRecordType(45) - case RRSIG extends DnsRecordType(46) - case NSEC extends DnsRecordType(47) - case DNSKEY extends DnsRecordType(48) - case DHCID extends DnsRecordType(49) - case NSEC3 extends DnsRecordType(50) - case NSEC3PARAM extends DnsRecordType(51) - case TLSA extends DnsRecordType(52) - case SMIMEA extends DnsRecordType(53) - case HIP extends DnsRecordType(55) - case NINFO extends DnsRecordType(56) - case RKEY extends DnsRecordType(57) - case TALINK extends DnsRecordType(58) - case CDS extends DnsRecordType(59) - case CDNSKEY extends DnsRecordType(60) - case OPENPGPKEY extends DnsRecordType(61) - case CSYNC extends DnsRecordType(62) - case ZONEMD extends DnsRecordType(63) - case SPF extends DnsRecordType(99) - case UINFO extends DnsRecordType(100) - case UID extends DnsRecordType(101) - case GID extends DnsRecordType(102) - case UNSPEC extends DnsRecordType(103) - case NID extends DnsRecordType(104) - case L32 extends DnsRecordType(105) - case L64 extends DnsRecordType(106) - case LP extends DnsRecordType(107) - case EUI48 extends DnsRecordType(108) - case EUI64 extends DnsRecordType(109) - case TKEY extends DnsRecordType(249) - case TSIG extends DnsRecordType(250) - case IXFR extends DnsRecordType(251) - case AXFR extends DnsRecordType(252) - case MAILB extends DnsRecordType(253) - case MAILA extends DnsRecordType(254) - case `*` extends DnsRecordType(255) + case A extends DnsRecordType(1) + case NS extends DnsRecordType(2) + case MD extends DnsRecordType(3) + case MF extends DnsRecordType(4) + case CNAME extends DnsRecordType(5) + case SOA extends DnsRecordType(6) + case MB extends DnsRecordType(7) + case MG extends DnsRecordType(8) + case MR extends DnsRecordType(9) + case NULL extends DnsRecordType(10) + case WKS extends DnsRecordType(11) + case PTR extends DnsRecordType(12) + case HINFO extends DnsRecordType(13) + case MINFO extends DnsRecordType(14) + case MX extends DnsRecordType(15) + case TXT extends DnsRecordType(16) + case RP extends DnsRecordType(17) + case AFSDB extends DnsRecordType(18) + case X25 extends DnsRecordType(19) + case ISDN extends DnsRecordType(20) + case RT extends DnsRecordType(21) + case NSAP extends DnsRecordType(22) + case `NSAP-PTR` extends DnsRecordType(23) + case SIG extends DnsRecordType(24) + case KEY extends DnsRecordType(25) + case PX extends DnsRecordType(26) + case GPOS extends DnsRecordType(27) + case AAAA extends DnsRecordType(28) + case LOC extends DnsRecordType(29) + case NXT extends DnsRecordType(30) + case EID extends DnsRecordType(31) + case NIMLOC extends DnsRecordType(32) + case SRV extends DnsRecordType(33) + case ATMA extends DnsRecordType(34) + case NAPTR extends DnsRecordType(35) + case KX extends DnsRecordType(36) + case CERT extends DnsRecordType(37) + case A6 extends DnsRecordType(38) + case DNAME extends DnsRecordType(39) + case SINK extends DnsRecordType(40) + case OPT extends DnsRecordType(41) + case APL extends DnsRecordType(42) + case DS extends DnsRecordType(43) + case SSHFP extends DnsRecordType(44) + case IPSECKEY extends DnsRecordType(45) + case RRSIG extends DnsRecordType(46) + case NSEC extends DnsRecordType(47) + case DNSKEY extends DnsRecordType(48) + case DHCID extends DnsRecordType(49) + case NSEC3 extends DnsRecordType(50) + case NSEC3PARAM extends DnsRecordType(51) + case TLSA extends DnsRecordType(52) + case SMIMEA extends DnsRecordType(53) + case HIP extends DnsRecordType(55) + case NINFO extends DnsRecordType(56) + case RKEY extends DnsRecordType(57) + case TALINK extends DnsRecordType(58) + case CDS extends DnsRecordType(59) + case CDNSKEY extends DnsRecordType(60) + case OPENPGPKEY extends DnsRecordType(61) + case CSYNC extends DnsRecordType(62) + case ZONEMD extends DnsRecordType(63) + case SPF extends DnsRecordType(99) + case UINFO extends DnsRecordType(100) + case UID extends DnsRecordType(101) + case GID extends DnsRecordType(102) + case UNSPEC extends DnsRecordType(103) + case NID extends DnsRecordType(104) + case L32 extends DnsRecordType(105) + case L64 extends DnsRecordType(106) + case LP extends DnsRecordType(107) + case EUI48 extends DnsRecordType(108) + case EUI64 extends DnsRecordType(109) + case TKEY extends DnsRecordType(249) + case TSIG extends DnsRecordType(250) + case IXFR extends DnsRecordType(251) + case AXFR extends DnsRecordType(252) + case MAILB extends DnsRecordType(253) + case MAILA extends DnsRecordType(254) + case `*` extends DnsRecordType(255) case Unassigned(value: Int) extends DnsRecordType(value) object DnsRecordType: diff --git a/model/src/main/scala/fr/davit/taxonomy/model/record/DnsResourceRecord.scala b/model/src/main/scala/fr/davit/taxonomy/model/record/DnsResourceRecord.scala index ffb2e0b..e804367 100644 --- a/model/src/main/scala/fr/davit/taxonomy/model/record/DnsResourceRecord.scala +++ b/model/src/main/scala/fr/davit/taxonomy/model/record/DnsResourceRecord.scala @@ -30,11 +30,11 @@ final case class DnsResourceRecord( ) enum DnsRecordClass(val code: Int): - case Internet extends DnsRecordClass(1) - case Chaos extends DnsRecordClass(3) - case Hesiod extends DnsRecordClass(4) - case None extends DnsRecordClass(234) - case Any extends DnsRecordClass(255) + case Internet extends DnsRecordClass(1) + case Chaos extends DnsRecordClass(3) + case Hesiod extends DnsRecordClass(4) + case None extends DnsRecordClass(234) + case Any extends DnsRecordClass(255) case Unassigned(value: Int) extends DnsRecordClass(value) object DnsRecordClass: diff --git a/scodec/src/main/scala/fr/davit/taxonomy/scodec/DnsCodec.scala b/scodec/src/main/scala/fr/davit/taxonomy/scodec/DnsCodec.scala index 2441011..ca2a343 100644 --- a/scodec/src/main/scala/fr/davit/taxonomy/scodec/DnsCodec.scala +++ b/scodec/src/main/scala/fr/davit/taxonomy/scodec/DnsCodec.scala @@ -16,17 +16,17 @@ package fr.davit.taxonomy.scodec -import _root_.scodec.bits._ -import _root_.scodec.codecs._ -import _root_.scodec.{Attempt, Codec, DecodeResult, Decoder, Err, SizeBound} -import fr.davit.taxonomy.model.record._ -import fr.davit.taxonomy.model._ +import _root_.scodec.bits.* +import _root_.scodec.codecs.* +import _root_.scodec.{Attempt, Codec, Decoder, DecodeResult, Err, SizeBound} +import fr.davit.taxonomy.model.record.* +import fr.davit.taxonomy.model.* import scodec.Attempt.{Failure, Successful} import java.net.{Inet4Address, Inet6Address, InetAddress} import java.nio.charset.Charset import scala.collection.mutable -import scala.concurrent.duration._ +import scala.concurrent.duration.* trait DnsCodec: @@ -92,8 +92,8 @@ trait DnsCodec: lazy val dnsNAPTRRecordData: Codec[DnsNAPTRRecordData] = (uint16 :: uint16 :: characterString :: characterString :: characterString :: domainName).as[DnsNAPTRRecordData] - lazy val dnsNSRecordData: Codec[DnsNSRecordData] = domainName.as[DnsNSRecordData] - lazy val dnsPTRRecordData: Codec[DnsPTRRecordData] = domainName.as[DnsPTRRecordData] + lazy val dnsNSRecordData: Codec[DnsNSRecordData] = domainName.as[DnsNSRecordData] + lazy val dnsPTRRecordData: Codec[DnsPTRRecordData] = domainName.as[DnsPTRRecordData] lazy val dnsSOARecordData: Codec[DnsSOARecordData] = (domainName :: domainName :: uint32 :: ttl :: ttl :: ttl :: ttl).as[DnsSOARecordData] @@ -172,17 +172,17 @@ class DnsMessageDecoder(bits: BitVector) extends DnsCodec: .decode(data) .flatMap { result => result.value match - case Right("") => + case Right("") => val remainder = stash.getOrElse(result.remainder) stash = None seenPtrs.clear() Successful(DecodeResult(Nil, remainder)) - case Right(label) => + case Right(label) => labels.decode(result.remainder).map(_.map(domain => label :: domain)) case Left(ptr) if seenPtrs.contains(ptr) => Failure(Err("Name contains a pointer that loops")) - case Left(ptr) => - if (stash.isEmpty) stash = Some(result.remainder) + case Left(ptr) => + if stash.isEmpty then stash = Some(result.remainder) seenPtrs += ptr labels.decode(bits.drop(ptr * 8L)) } diff --git a/scodec/src/test/scala/fr/davit/taxonomy/scodec/DnsCodecSpec.scala b/scodec/src/test/scala/fr/davit/taxonomy/scodec/DnsCodecSpec.scala index 95107e0..da309fb 100644 --- a/scodec/src/test/scala/fr/davit/taxonomy/scodec/DnsCodecSpec.scala +++ b/scodec/src/test/scala/fr/davit/taxonomy/scodec/DnsCodecSpec.scala @@ -18,12 +18,12 @@ package fr.davit.taxonomy.scodec import java.net.{Inet4Address, InetAddress} import fr.davit.taxonomy.model.record.{DnsARecordData, DnsRecordClass, DnsRecordType, DnsResourceRecord} -import fr.davit.taxonomy.model._ +import fr.davit.taxonomy.model.* import munit.FunSuite -import scodec.bits._ +import scodec.bits.* import scodec.{Attempt, Err} -import scala.concurrent.duration._ +import scala.concurrent.duration.* import scala.util.control.NonFatal class DnsCodecSpec extends FunSuite: @@ -94,7 +94,7 @@ class DnsCodecSpec extends FunSuite: } test("detect name pointer cycle") { - val data = ( + val data = ( ByteVector.fromByte(5) ++ ByteVector("cycle".getBytes(DnsCodec.ascii)) ++ ByteVector.fromByte(192.toByte) ++ ByteVector.fromByte(0) ).toBitVector @@ -112,17 +112,17 @@ class DnsCodecSpec extends FunSuite: val data = ( ByteVector(name.length.toByte) ++ ByteVector(name.getBytes(DnsCodec.ascii)) ++ ByteVector.fromByte(0) ++ // name - ByteVector.fromInt(DnsRecordType.A.code, 2) ++ // type - ByteVector.fromInt(DnsRecordClass.Internet.code, 2) ++ // class - ByteVector.fromLong(ttl.toSeconds, 4) ++ // ttl - ByteVector.fromInt(4, 2) ++ ByteVector(ipv4.getAddress) // rdlength + rdata + ByteVector.fromInt(DnsRecordType.A.code, 2) ++ // type + ByteVector.fromInt(DnsRecordClass.Internet.code, 2) ++ // class + ByteVector.fromLong(ttl.toSeconds, 4) ++ // ttl + ByteVector.fromInt(4, 2) ++ ByteVector(ipv4.getAddress) // rdlength + rdata ).toBitVector assertEquals(DnsCodec.dnsResourceRecord.encode(aRecord).require, data) assertEquals(DnsCodec.dnsResourceRecord.complete.decode(data).require.value, aRecord) } test("encode / decode DNS messages") { - val header = DnsHeader( + val header = DnsHeader( id = 1, `type` = DnsType.Query, opCode = DnsOpCode.StandardQuery, @@ -139,7 +139,7 @@ class DnsCodecSpec extends FunSuite: `class` = DnsRecordClass.Internet ) - val query = DnsMessage( + val query = DnsMessage( header, List(question), List.empty, @@ -150,7 +150,7 @@ class DnsCodecSpec extends FunSuite: assertEquals(DnsCodec.dnsMessage.encode(query).require, queryData) assertEquals(DnsCodec.dnsMessage.complete.decode(queryData).require.value, query) - val answer = DnsResourceRecord( + val answer = DnsResourceRecord( name = "davit.fr", cacheFlush = false, `class` = DnsRecordClass.Internet,