@@ -560,18 +560,18 @@ public struct Parser {
560560 /// - Returns: Array of PublishPort objects
561561 /// - Throws: ContainerizationError if parsing fails
562562 public static func publishPorts( _ rawPublishPorts: [ String ] ) throws -> [ PublishPort ] {
563- var sockets : [ PublishPort ] = [ ]
563+ var publishPorts : [ PublishPort ] = [ ]
564564
565565 // Process each raw port string
566566 for socket in rawPublishPorts {
567- let parsedSockets = try Parser . publishPort ( socket)
568- sockets . append ( contentsOf : parsedSockets )
567+ let publishPort = try Parser . publishPort ( socket)
568+ publishPorts . append ( publishPort )
569569 }
570- return sockets
570+ return publishPorts
571571 }
572572
573- // Parse a single `--publish-port` argument into a `[ PublishPort] `.
574- public static func publishPort( _ portText: String ) throws -> [ PublishPort ] {
573+ // Parse a single `--publish-port` argument into a `PublishPort`.
574+ public static func publishPort( _ portText: String ) throws -> PublishPort {
575575 let protoSplit = portText. split ( separator: " / " )
576576 let proto : PublishProtocol
577577 let addressAndPortText : String
@@ -607,99 +607,84 @@ public struct Parser {
607607 throw ContainerizationError ( . invalidArgument, message: " invalid publish address: \( portText) " )
608608 }
609609
610- guard let hostPort = Int ( hostPortText) else {
611- let hostPortRangeStart : Int
612- let hostPortRangeEnd : Int
613- let containerPortRangeStart : Int
614- let containerPortRangeEnd : Int
610+ let hostPortRangeStart : UInt16
611+ let hostPortRangeEnd : UInt16
612+ let containerPortRangeStart : UInt16
613+ let containerPortRangeEnd : UInt16
615614
616- let hostPortParts = hostPortText. split ( separator: " - " )
617- switch hostPortParts. count {
618- case 2 :
619- guard let start = Int ( hostPortParts [ 0 ] ) else {
620- throw ContainerizationError ( . invalidArgument, message: " invalid publish host port \( hostPortText) " )
621- }
622-
623- guard let end = Int ( hostPortParts [ 1 ] ) else {
624- throw ContainerizationError ( . invalidArgument, message: " invalid publish host port \( hostPortText) " )
625- }
626-
627- hostPortRangeStart = start
628- hostPortRangeEnd = end
629- default :
630- throw ContainerizationError ( . invalidArgument, message: " invalid publish host port \( hostPortText) " )
615+ let hostPortParts = hostPortText. split ( separator: " - " )
616+ switch hostPortParts. count {
617+ case 1 :
618+ guard let start = UInt16 ( hostPortParts [ 0 ] ) else {
619+ throw ContainerizationError ( . invalidArgument, message: " invalid publish host port: \( hostPortText) " )
631620 }
632-
633- let containerPortParts = containerPortText. split ( separator: " - " )
634- switch containerPortParts. count {
635- case 2 :
636- guard let start = Int ( containerPortParts [ 0 ] ) else {
637- throw ContainerizationError ( . invalidArgument, message: " invalid publish container port \( containerPortText) " )
638- }
639-
640- guard let end = Int ( containerPortParts [ 1 ] ) else {
641- throw ContainerizationError ( . invalidArgument, message: " invalid publish container port \( containerPortText) " )
642- }
643-
644- containerPortRangeStart = start
645- containerPortRangeEnd = end
646- default :
647- throw ContainerizationError ( . invalidArgument, message: " invalid publish container port \( containerPortText) " )
621+ hostPortRangeStart = start
622+ hostPortRangeEnd = start
623+ case 2 :
624+ guard let start = UInt16 ( hostPortParts [ 0 ] ) else {
625+ throw ContainerizationError ( . invalidArgument, message: " invalid publish host port: \( hostPortText) " )
648626 }
649627
650- guard hostPortRangeStart > 1 ,
651- hostPortRangeEnd > 1 ,
652- hostPortRangeStart < hostPortRangeEnd,
653- hostPortRangeEnd > hostPortRangeStart
654- else {
655- throw ContainerizationError ( . invalidArgument, message: " invalid publish host port range \( hostPortText) " )
628+ guard let end = UInt16 ( hostPortParts [ 1 ] ) else {
629+ throw ContainerizationError ( . invalidArgument, message: " invalid publish host port: \( hostPortText) " )
656630 }
657631
658- guard containerPortRangeStart > 1 ,
659- containerPortRangeEnd > 1 ,
660- containerPortRangeStart < containerPortRangeEnd,
661- containerPortRangeEnd > containerPortRangeStart
662- else {
663- throw ContainerizationError ( . invalidArgument, message: " invalid publish container port range \( containerPortText) " )
632+ hostPortRangeStart = start
633+ hostPortRangeEnd = end
634+ default :
635+ throw ContainerizationError ( . invalidArgument, message: " invalid publish host port: \( hostPortText) " )
636+ }
637+
638+ let containerPortParts = containerPortText. split ( separator: " - " )
639+ switch containerPortParts. count {
640+ case 1 :
641+ guard let start = UInt16 ( containerPortParts [ 0 ] ) else {
642+ throw ContainerizationError ( . invalidArgument, message: " invalid publish container port: \( containerPortText) " )
664643 }
665644
666- let hostRange = hostPortRangeEnd - hostPortRangeStart
667- let containerRange = containerPortRangeEnd - containerPortRangeStart
645+ containerPortRangeStart = start
646+ containerPortRangeEnd = start
647+ case 2 :
648+ guard let start = UInt16 ( containerPortParts [ 0 ] ) else {
649+ throw ContainerizationError ( . invalidArgument, message: " invalid publish container port: \( containerPortText) " )
650+ }
668651
669- guard hostRange == containerRange else {
670- throw ContainerizationError ( . invalidArgument, message: " publish host and container port range are not equal \( addressAndPortText ) " )
652+ guard let end = UInt16 ( containerPortParts [ 1 ] ) else {
653+ throw ContainerizationError ( . invalidArgument, message: " invalid publish container port: \( containerPortText ) " )
671654 }
672655
673- var publishPorts = [ PublishPort] ( )
674- for i in 0 ..< hostPortRangeEnd - hostPortRangeStart + 1 {
675- let hostPort = hostPortRangeStart + i
676- let containerPort = containerPortRangeStart + i
656+ containerPortRangeStart = start
657+ containerPortRangeEnd = end
658+ default :
659+ throw ContainerizationError ( . invalidArgument, message: " invalid publish container port: \( containerPortText) " )
660+ }
677661
678- publishPorts. append (
679- PublishPort (
680- hostAddress: hostAddress,
681- hostPort: hostPort,
682- containerPort: containerPort,
683- proto: proto
684- )
685- )
686- }
662+ guard hostPortRangeStart > 1 ,
663+ hostPortRangeStart <= hostPortRangeEnd
664+ else {
665+ throw ContainerizationError ( . invalidArgument, message: " invalid publish host port range: \( hostPortText) " )
666+ }
687667
688- return publishPorts
668+ guard containerPortRangeStart > 1 ,
669+ containerPortRangeStart <= containerPortRangeEnd
670+ else {
671+ throw ContainerizationError ( . invalidArgument, message: " invalid publish container port range: \( containerPortText) " )
689672 }
690673
691- guard let containerPort = Int ( containerPortText) else {
692- throw ContainerizationError ( . invalidArgument, message: " invalid publish container port: \( containerPortText) " )
674+ let hostCount = hostPortRangeEnd - hostPortRangeStart + 1
675+ let containerCount = containerPortRangeEnd - containerPortRangeStart + 1
676+
677+ guard hostCount == containerCount else {
678+ throw ContainerizationError ( . invalidArgument, message: " publish host and container port counts are not equal: \( addressAndPortText) " )
693679 }
694680
695- return [
696- PublishPort (
697- hostAddress: hostAddress,
698- hostPort: hostPort,
699- containerPort: containerPort,
700- proto: proto
701- )
702- ]
681+ return PublishPort (
682+ hostAddress: hostAddress,
683+ hostPort: hostPortRangeStart,
684+ containerPort: containerPortRangeStart,
685+ proto: proto,
686+ count: hostCount
687+ )
703688 }
704689
705690 /// Parse --publish-socket arguments into PublishSocket objects
0 commit comments