Repository: rsteube/carapace (go)

Issue:
InvokedAction: clear distinction to Action
Use private composition instead of embedding.

Originally `InvokedAction` was just a type alias of `Action`.
Embedding was then used to avoid some lsp oddities.

Functions of `Action` can still be called on `InvokedAction`.
While that does not pose an issue for a clear distinction and to enforce a consistent usage it should prevented.


Pull request:
InvokedAction: private composition
fix #983

Patch:
diff --git a/action.go b/action.go
index 865e9a7..d428ff8 100644
--- a/action.go
+++ b/action.go
@@ -46,7 +46,7 @@ func (a Action) Cache(timeout time.Duration, keys ...pkgcache.Key) Action {
 			}
 
 			invokedAction := (Action{callback: cachedCallback}).Invoke(c)
-			if invokedAction.meta.Messages.IsEmpty() {
+			if invokedAction.action.meta.Messages.IsEmpty() {
 				if cacheFile, err := cache.File(file, line, keys...); err == nil { // regenerate as cache keys might have changed due to invocation
 					_ = cache.Write(cacheFile, invokedAction.export())
 				}
@@ -122,7 +122,7 @@ func (a Action) Invoke(c Context) InvokedAction {
 
 	if a.rawValues == nil && a.callback != nil {
 		result := a.callback(c).Invoke(c)
-		result.meta.Merge(a.meta)
+		result.action.meta.Merge(a.meta)
 		return result
 	}
 	return InvokedAction{a}
@@ -154,7 +154,7 @@ func (a Action) MultiPartsP(delimiter string, pattern string, f func(placeholder
 			staticMatches := make(map[int]bool)
 
 		path:
-			for index, value := range invoked.rawValues {
+			for index, value := range invoked.action.rawValues {
 				segments := strings.Split(value.Value, delimiter)
 			segment:
 				for index, segment := range segments {
@@ -185,7 +185,7 @@ func (a Action) MultiPartsP(delimiter string, pattern string, f func(placeholder
 
 				// store segment as path matched so far and this is currently being completed
 				if len(segments) == (len(c.Parts) + 1) {
-					matchedSegments[segments[len(c.Parts)]] = invoked.rawValues[index]
+					matchedSegments[segments[len(c.Parts)]] = invoked.action.rawValues[index]
 				} else {
 					matchedSegments[segments[len(c.Parts)]+delimiter] = common.RawValue{}
 				}
@@ -200,8 +200,8 @@ func (a Action) MultiPartsP(delimiter string, pattern string, f func(placeholder
 					}
 					actions = append(actions, ActionCallback(func(c Context) Action {
 						invoked := f(trimmedKey, matchedData).Invoke(c).Suffix(suffix)
-						for index := range invoked.rawValues {
-							invoked.rawValues[index].Display += suffix
+						for index := range invoked.action.rawValues {
+							invoked.action.rawValues[index].Display += suffix
 						}
 						return invoked.ToA()
 					}))
@@ -211,7 +211,7 @@ func (a Action) MultiPartsP(delimiter string, pattern string, f func(placeholder
 			}
 
 			a := Batch(actions...).ToA()
-			a.meta.Merge(invoked.meta)
+			a.meta.Merge(invoked.action.meta)
 			return a
 		})
 	})
@@ -310,19 +310,19 @@ func (a Action) split(pipelines bool) Action {
 		}
 
 		invoked := a.Invoke(c)
-		for index, value := range invoked.rawValues {
-			if !invoked.meta.Nospace.Matches(value.Value) || strings.Contains(value.Value, " ") { // TODO special characters
+		for index, value := range invoked.action.rawValues {
+			if !invoked.action.meta.Nospace.Matches(value.Value) || strings.Contains(value.Value, " ") { // TODO special characters
 				switch tokens.CurrentToken().State {
 				case shlex.QUOTING_ESCAPING_STATE:
-					invoked.rawValues[index].Value = fmt.Sprintf(`"%v"`, strings.ReplaceAll(value.Value, `"`, `\"`))
+					invoked.action.rawValues[index].Value = fmt.Sprintf(`"%v"`, strings.ReplaceAll(value.Value, `"`, `\"`))
 				case shlex.QUOTING_STATE:
-					invoked.rawValues[index].Value = fmt.Sprintf(`'%v'`, strings.ReplaceAll(value.Value, `'`, `'"'"'`))
+					invoked.action.rawValues[index].Value = fmt.Sprintf(`'%v'`, strings.ReplaceAll(value.Value, `'`, `'"'"'`))
 				default:
-					invoked.rawValues[index].Value = strings.Replace(value.Value, ` `, `\ `, -1)
+					invoked.action.rawValues[index].Value = strings.Replace(value.Value, ` `, `\ `, -1)
 				}
 			}
-			if !invoked.meta.Nospace.Matches(value.Value) {
-				invoked.rawValues[index].Value += " "
+			if !invoked.action.meta.Nospace.Matches(value.Value) {
+				invoked.action.rawValues[index].Value += " "
 			}
 		}
 		return invoked.Prefix(prefix).ToA().NoSpace()
@@ -346,8 +346,8 @@ func (a Action) Style(s string) Action {
 func (a Action) StyleF(f func(s string, sc style.Context) string) Action {
 	return ActionCallback(func(c Context) Action {
 		invoked := a.Invoke(c)
-		for index, v := range invoked.rawValues {
-			invoked.rawValues[index].Style = f(v.Value, c)
+		for index, v := range invoked.action.rawValues {
+			invoked.action.rawValues[index].Style = f(v.Value, c)
 		}
 		return invoked.ToA()
 	})
@@ -379,7 +379,7 @@ func (a Action) Suffix(suffix string) Action {
 func (a Action) Suppress(expr ...string) Action {
 	return ActionCallback(func(c Context) Action {
 		invoked := a.Invoke(c)
-		if err := invoked.meta.Messages.Suppress(expr...); err != nil {
+		if err := invoked.action.meta.Messages.Suppress(expr...); err != nil {
 			return ActionMessage(err.Error())
 		}
 		return invoked.ToA()
@@ -403,8 +403,8 @@ func (a Action) Tag(tag string) Action {
 func (a Action) TagF(f func(s string) string) Action {
 	return ActionCallback(func(c Context) Action {
 		invoked := a.Invoke(c)
-		for index, v := range invoked.rawValues {
-			invoked.rawValues[index].Tag = f(v.Value)
+		for index, v := range invoked.action.rawValues {
+			invoked.action.rawValues[index].Tag = f(v.Value)
 		}
 		return invoked.ToA()
 	})
diff --git a/compat.go b/compat.go
index 3568c40..6321e2c 100644
--- a/compat.go
+++ b/compat.go
@@ -41,8 +41,8 @@ func registerFlagCompletion(cmd *cobra.Command) {
 }
 
 func cobraValuesFor(action InvokedAction) []string {
-	result := make([]string, len(action.rawValues))
-	for index, r := range action.rawValues {
+	result := make([]string, len(action.action.rawValues))
+	for index, r := range action.action.rawValues {
 		if r.Description != "" {
 			result[index] = fmt.Sprintf("%v\t%v", r.Value, r.Description)
 		} else {
@@ -54,8 +54,8 @@ func cobraValuesFor(action InvokedAction) []string {
 
 func cobraDirectiveFor(action InvokedAction) cobra.ShellCompDirective {
 	directive := cobra.ShellCompDirectiveNoFileComp
-	for _, val := range action.rawValues {
-		if action.meta.Nospace.Matches(val.Value) {
+	for _, val := range action.action.rawValues {
+		if action.action.meta.Nospace.Matches(val.Value) {
 			directive = directive | cobra.ShellCompDirectiveNoSpace
 			break
 		}
diff --git a/docs/src/carapace/defaultActions/actionPositional.cast b/docs/src/carapace/defaultActions/actionPositional.cast
deleted file mode 100644
index a26472c..0000000
--- a/docs/src/carapace/defaultActions/actionPositional.cast
+++ /dev/null
@@ -1,138 +0,0 @@
-{"version": 2, "width": 108, "height": 24, "timestamp": 1704825114, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
-[0.103309, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
-[0.104763, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
-[0.127428, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[K\u001b[0;1;36mcarapace/example\u001b[0;m on \u001b[0;1;35m master\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.21.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
-[0.514321, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[0;32me\u001b[0;m\r\u001b[7C\u001b[?25h"]
-[0.514854, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[7C\u001b[?25h"]
-[0.515572, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[7C\u001b[?25h"]
-[0.515836, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[7C\u001b[?25h"]
-[0.53776, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[7C\u001b[?25h"]
-[0.538088, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[7C\u001b[?25h"]
-[0.745701, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[K\u001b[0;31mex\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[8C\u001b[?25h"]
-[0.893541, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[9C\u001b[?25h"]
-[1.075799, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[10C\u001b[?25h"]
-[1.147937, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[11C\u001b[?25h"]
-[1.309946, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[12C\u001b[?25h"]
-[1.426641, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[13C\u001b[?25h"]
-[1.512396, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[14C\u001b[?25h"]
-[1.630289, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[14Ca\r\u001b[15C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[15C\u001b[?25h"]
-[1.730485, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[15Cc\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[16C\u001b[?25h"]
-[1.967318, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[16Ct\r\u001b[17C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[17C\u001b[?25h"]
-[2.081088, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[17Ci\r\u001b[18C\u001b[?25h"]
-[2.08119, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[18C\u001b[?25h"]
-[2.192848, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[18Co\r\u001b[19C\u001b[?25h"]
-[2.193032, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[19C\u001b[?25h"]
-[2.244712, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[19Cn\r\u001b[20C\u001b[?25h"]
-[2.244839, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[20C\u001b[?25h"]
-[2.3675, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[20C \r\u001b[21C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[21C\u001b[?25h"]
-[2.571689, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[21CembeddedP\r\u001b[30C\u001b[?25h"]
-[3.092566, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[21C\u001b[K\u001b[0;4membeddedP1 \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7membeddedP1\u001b[0;m  embeddedPositional1\u001b[1A\r\u001b[22C\u001b[?25h"]
-[3.89446, "o", "\u001b[?25l\u001b[2A\r\r\n\u001b[21C\u001b[KembeddedP1 \r\n\u001b[J\u001b[A\r\u001b[32C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[32C\u001b[?25h"]
-[4.096122, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[32C\u001b[0;33m'embeddedP\u001b[0;m\r\u001b[42C\u001b[?25h"]
-[4.463037, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[32C\u001b[K\u001b[0;4;33m'embeddedP2 with space'\u001b[0;4m \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7membeddedP2 with space\u001b[0;m  embeddedPositional2 with space\u001b[1A\r\u001b[22C\u001b[?25h"]
-[5.350724, "o", "\u001b[?25l\u001b[2A\r\r\n\u001b[32C\u001b[K\u001b[0;33m'embeddedP2 with space'\u001b[0;m \r\n\u001b[J\u001b[A\r\u001b[56C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[56C\u001b[?25h"]
-[6.152443, "o", "\u001b[?25l\u001b[1A\r\u001b[0;2musage: \u001b[0;maction [pos1] [pos2] [--] [dashAny]...\u001b[K\r\n\u001b[0;31merror:\u001b[0;m no candidates\u001b[K\r\n\u001b[K\u001b[0;1;36mcarapace/example\u001b[0;m on \u001b[0;1;35m master\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.21.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m action embeddedP1 \u001b[0;33m'embeddedP2 with space'\u001b[0;m \r\u001b[56C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[56C\u001b[?25h"]
-[6.77359, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[56C-\r\u001b[57C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[57C\u001b[?25h"]
-[6.934896, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[57C-\r\u001b[58C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[58C\u001b[?25h"]
-[7.086692, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[58C \r\u001b[59C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[59C\u001b[?25h"]
-[7.320425, "o", "\u001b[?25l\u001b[1A\r\u001b[0;2musage: \u001b[0;maction [pos1] [pos2] [--] [dashAny]...\u001b[K\r\n\u001b[0;31merror:\u001b[0;m no candidates\u001b[K\r\n\u001b[K\u001b[0;1;36mcarapace/example\u001b[0;m on \u001b[0;1;35m master\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.21.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m action embeddedP1 \u001b[0;33m'embeddedP2 with space'\u001b[0;m -- \r\u001b[59C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[59C\u001b[?25h"]
-[7.895735, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[58C\u001b[K\r\u001b[58C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[58C\u001b[?25h"]
-[8.494621, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[57C\u001b[K\r\u001b[57C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[57C\u001b[?25h"]
-[8.536518, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[56C\u001b[K\r\u001b[56C\u001b[?25h"]
-[8.577091, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[55C\u001b[K\r\u001b[55C\u001b[?25h"]
-[8.616531, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[54C\u001b[K\r\u001b[54C\u001b[?25h"]
-[8.656762, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[53C\u001b[K\r\u001b[53C\u001b[?25h"]
-[8.696997, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[52C\u001b[K\r\u001b[52C\u001b[?25h"]
-[8.736648, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[51C\u001b[K\r\u001b[51C\u001b[?25h"]
-[8.737346, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[51C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[51C\u001b[?25h"]
-[8.775608, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[50C\u001b[K\r\u001b[50C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[50C\u001b[?25h"]
-[8.81662, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[49C\u001b[K\r\u001b[49C\u001b[?25h"]
-[8.816785, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[49C\u001b[?25h"]
-[8.856025, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[48C\u001b[K\r\u001b[48C\u001b[?25h"]
-[8.896059, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
-[8.936449, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
-[8.976121, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
-[9.015891, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
-[9.056149, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
-[9.097221, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
-[9.135717, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[41C\u001b[?25h"]
-[9.176666, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h"]
-[9.215809, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[39C\u001b[?25h"]
-[9.255791, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[38C\u001b[?25h"]
-[9.295857, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
-[9.335828, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
-[9.375778, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
-[9.416094, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[34C\u001b[K\r\u001b[34C\u001b[?25h"]
-[9.455706, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[33C\u001b[K\r\u001b[33C\u001b[?25h"]
-[9.496342, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[32C\u001b[K\r\u001b[32C\u001b[?25h"]
-[9.824192, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[32C-\r\u001b[33C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[33C\u001b[?25h"]
-[9.98988, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[33C-\r\u001b[34C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[34C\u001b[?25h"]
-[10.161142, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[34C \r\u001b[35C\u001b[?25h"]
-[10.458564, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[35C\u001b[0;33m'embeddedP\u001b[0;m\r\u001b[45C\u001b[?25h"]
-[10.916958, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[35C\u001b[K\u001b[0;4;33m'embeddedP2 with space'\u001b[0;4m \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7membeddedP2 with space\u001b[0;m  embeddedPositional2 with space\u001b[1A\r\u001b[22C\u001b[?25h"]
-[10.91756, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
-[10.918028, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
-[10.918215, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
-[11.359992, "o", "\u001b[?25l\u001b[2A\r\r\n\u001b[35C\u001b[K\u001b[0;33m'embeddedP2 with space'\u001b[0;m \r\n\u001b[J\u001b[A\r\u001b[59C\u001b[?25h"]
-[11.485486, "o", "\u001b[?25l\u001b[1A\r\u001b[0;2musage: \u001b[0;maction [pos1] [pos2] [--] [dashAny]...\u001b[K\r\n\u001b[0;31merror:\u001b[0;m no candidates\u001b[K\r\n\u001b[K\u001b[0;1;36mcarapace/example\u001b[0;m on \u001b[0;1;35m master\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.21.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m action embeddedP1 -- \u001b[0;33m'embeddedP2 with space'\u001b[0;m \r\u001b[59C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[59C\u001b[?25h"]
-[11.889139, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[58C\u001b[K\r\u001b[58C\u001b[?25h"]
-[12.488721, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[57C\u001b[K\r\u001b[57C\u001b[?25h"]
-[12.528893, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[56C\u001b[K\r\u001b[56C\u001b[?25h"]
-[12.569198, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[55C\u001b[K\r\u001b[55C\u001b[?25h"]
-[12.609331, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[54C\u001b[K\r\u001b[54C\u001b[?25h"]
-[12.649001, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[53C\u001b[K\r\u001b[53C\u001b[?25h"]
-[12.689727, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[52C\u001b[K\r\u001b[52C\u001b[?25h"]
-[12.729571, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[51C\u001b[K\r\u001b[51C\u001b[?25h"]
-[12.768761, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[50C\u001b[K\r\u001b[50C\u001b[?25h"]
-[12.809011, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[49C\u001b[K\r\u001b[49C\u001b[?25h"]
-[12.848831, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[48C\u001b[K\r\u001b[48C\u001b[?25h"]
-[12.888728, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
-[12.929039, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
-[12.968755, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
-[13.009099, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
-[13.048481, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
-[13.088623, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[42C\u001b[?25h"]
-[13.128588, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[41C\u001b[?25h"]
-[13.168839, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h"]
-[13.208224, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
-[13.249433, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[38C\u001b[?25h"]
-[13.289254, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
-[13.329904, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
-[13.368924, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
-[13.408892, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[34C\u001b[K\r\u001b[34C\u001b[?25h"]
-[13.448967, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[33C\u001b[K\r\u001b[33C\u001b[?25h"]
-[13.488957, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[32C\u001b[K\r\u001b[32C\u001b[?25h"]
-[13.528807, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[31C\u001b[K\r\u001b[31C\u001b[?25h"]
-[13.569257, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[30C\u001b[K\r\u001b[30C\u001b[?25h"]
-[13.609124, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[29C\u001b[K\r\u001b[29C\u001b[?25h"]
-[13.649027, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[28C\u001b[K\r\u001b[28C\u001b[?25h"]
-[13.689792, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[27C\u001b[K\r\u001b[27C\u001b[?25h"]
-[13.729573, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[26C\u001b[K\r\u001b[26C\u001b[?25h"]
-[13.867068, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[25C\u001b[K\r\u001b[25C\u001b[?25h"]
-[14.019925, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[24C\u001b[K\r\u001b[24C\u001b[?25h"]
-[14.173957, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[23C\u001b[K\r\u001b[23C\u001b[?25h"]
-[14.321003, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[22C\u001b[K\r\u001b[22C\u001b[?25h"]
-[14.498587, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[21C\u001b[K\r\u001b[21C\u001b[?25h"]
-[14.569515, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[21C-\r\u001b[22C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[22C\u001b[?25h"]
-[14.929237, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[22C-\r\u001b[23C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[23C\u001b[?25h"]
-[15.15994, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[23C \r\u001b[24C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[24C\u001b[?25h"]
-[15.376734, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[24CembeddedP\r\u001b[33C\u001b[?25h"]
-[15.906585, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[24C\u001b[K\u001b[0;4membeddedP1 \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7membeddedP1\u001b[0;m  embeddedPositional1\u001b[1A\r\u001b[22C\u001b[?25h"]
-[16.315181, "o", "\u001b[?25l\u001b[2A\r\r\n\u001b[24C\u001b[KembeddedP1 \r\n\u001b[J\u001b[A\r\u001b[35C\u001b[?25h"]
-[16.315591, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[35C\u001b[?25h"]
-[16.479526, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[35C\u001b[0;33m'embeddedP\u001b[0;m\r\u001b[45C\u001b[?25h"]
-[16.810154, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[35C\u001b[K\u001b[0;4;33m'embeddedP2 with space'\u001b[0;4m \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7membeddedP2 with space\u001b[0;m  embeddedPositional2 with space\u001b[1A\r\u001b[22C\u001b[?25h"]
-[17.21342, "o", "\u001b[?25l\u001b[2A\r\r\n\u001b[45C\u001b[K\u001b[0;4;33mositional2 with space'\u001b[0;4m \r\n\r\n\u001b[0;m\u001b[KembeddedP2 with space  \u001b[0;7membeddedPositional2 with space\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
-[17.213788, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
-[17.60452, "o", "\u001b[?25l\u001b[2A\r\r\n\u001b[35C\u001b[K\u001b[0;33m'embeddedPositional2 with space'\u001b[0;m \r\n\u001b[J\u001b[A\r\u001b[68C\u001b[?25h"]
-[17.60495, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[68C\u001b[?25h"]
-[17.759099, "o", "\u001b[?25l\u001b[1A\r\u001b[0;2musage: \u001b[0;maction [pos1] [pos2] [--] [dashAny]...\u001b[K\r\n\u001b[0;31merror:\u001b[0;m no candidates\u001b[K\r\n\u001b[K\u001b[0;1;36mcarapace/example\u001b[0;m on \u001b[0;1;35m master\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.21.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m action -- embeddedP1 \u001b[0;33m'embeddedPositional2 with space'\u001b[0;m \r\u001b[68C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[68C\u001b[?25h"]
-[18.465469, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[6C\u001b[?25h"]
-[18.466605, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[6C\u001b[?25h"]
-[18.494637, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[6C\u001b[?25h"]
-[18.862901, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[0;32me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[7C\u001b[?25h"]
-[19.040686, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[K\u001b[0;31mex\u001b[0;m\r\u001b[8C\u001b[?25h"]
-[19.040996, "o", "\u001b[?25l\u001b[1A\r\r\n\r\u001b[8C\u001b[?25h"]
-[19.206099, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[9C\u001b[?25h"]
-[19.282595, "o", "\u001b[?25l\u001b[1A\r\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[1A\r\r\n\r\u001b[10C\u001b[?25h"]
-[19.460697, "o", "\u001b[?25l\u001b[1A\r\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/defaultActions/actionPositional.md b/docs/src/carapace/defaultActions/actionPositional.md
index 46c73b3..fe28212 100644
--- a/docs/src/carapace/defaultActions/actionPositional.md
+++ b/docs/src/carapace/defaultActions/actionPositional.md
@@ -1,15 +1,1 @@
 # ActionPositional
-
-[`ActionPositional`] completes positional arguments for given command ignoring `--` (dash).
-
-```go
-carapace.Gen(cmd).DashAnyCompletion(
-	carapace.ActionPositional(cmd),
-)
-```
-
-> It resets `Context.Args` to contain the full arguments and is meant as a means to continue positional completion on dash positions.
-
-![](./actionPositional.cast)
-
-[`ActionPositional`]:https://pkg.go.dev/github.com/rsteube/carapace#ActionPositional
diff --git a/invokedAction.go b/invokedAction.go
index e99c6e6..9221392 100644
--- a/invokedAction.go
+++ b/invokedAction.go
@@ -11,20 +11,20 @@ import (
 
 // InvokedAction is a logical alias for an Action whose (nested) callback was invoked.
 type InvokedAction struct {
-	Action
+	action Action
 }
 
-func (a InvokedAction) export() export.Export {
-	return export.Export{Meta: a.meta, Values: a.rawValues}
+func (ia InvokedAction) export() export.Export {
+	return export.Export{Meta: ia.action.meta, Values: ia.action.rawValues}
 }
 
 // Filter filters given values.
 //
 //	a := carapace.ActionValues("A", "B", "C").Invoke(c)
 //	b := a.Filter([]string{"B"}) // ["A", "C"]
-func (a InvokedAction) Filter(values ...string) InvokedAction {
-	a.rawValues = a.rawValues.Filter(values...)
-	return a
+func (ia InvokedAction) Filter(values ...string) InvokedAction {
+	ia.action.rawValues = ia.action.rawValues.Filter(values...)
+	return ia
 }
 
 // Merge merges InvokedActions (existing values are overwritten)
@@ -32,47 +32,47 @@ func (a InvokedAction) Filter(values ...string) InvokedAction {
 //	a := carapace.ActionValues("A", "B").Invoke(c)
 //	b := carapace.ActionValues("B", "C").Invoke(c)
 //	c := a.Merge(b) // ["A", "B", "C"]
-func (a InvokedAction) Merge(others ...InvokedAction) InvokedAction {
-	for _, other := range append([]InvokedAction{a}, others...) {
-		a.rawValues = append(a.rawValues, other.rawValues...)
-		a.meta.Merge(other.meta)
+func (ia InvokedAction) Merge(others ...InvokedAction) InvokedAction {
+	for _, other := range append([]InvokedAction{ia}, others...) {
+		ia.action.rawValues = append(ia.action.rawValues, other.action.rawValues...)
+		ia.action.meta.Merge(other.action.meta)
 	}
-	a.rawValues = a.rawValues.Unique()
-	return a
+	ia.action.rawValues = ia.action.rawValues.Unique()
+	return ia
 }
 
 // Prefix adds a prefix to values (only the ones inserted, not the display values)
 //
 //	carapace.ActionValues("melon", "drop", "fall").Invoke(c).Prefix("water")
-func (a InvokedAction) Prefix(prefix string) InvokedAction {
-	for index, val := range a.rawValues {
-		a.rawValues[index].Value = prefix + val.Value
+func (ia InvokedAction) Prefix(prefix string) InvokedAction {
+	for index, val := range ia.action.rawValues {
+		ia.action.rawValues[index].Value = prefix + val.Value
 	}
-	return a
+	return ia
 }
 
 // Retain retains given values.
 //
 //	a := carapace.ActionValues("A", "B", "C").Invoke(c)
 //	b := a.Retain([]string{"A", "C"}) // ["A", "C"]
-func (a InvokedAction) Retain(values ...string) InvokedAction {
-	a.rawValues = a.rawValues.Retain(values...)
-	return a
+func (ia InvokedAction) Retain(values ...string) InvokedAction {
+	ia.action.rawValues = ia.action.rawValues.Retain(values...)
+	return ia
 }
 
 // Suffix adds a suffx to values (only the ones inserted, not the display values)
 //
 //	carapace.ActionValues("apple", "melon", "orange").Invoke(c).Suffix("juice")
-func (a InvokedAction) Suffix(suffix string) InvokedAction {
-	for index, val := range a.rawValues {
-		a.rawValues[index].Value = val.Value + suffix
+func (ia InvokedAction) Suffix(suffix string) InvokedAction {
+	for index, val := range ia.action.rawValues {
+		ia.action.rawValues[index].Value = val.Value + suffix
 	}
-	return a
+	return ia
 }
 
 // ToA casts an InvokedAction to Action.
-func (a InvokedAction) ToA() Action {
-	return a.Action
+func (ia InvokedAction) ToA() Action {
+	return ia.action
 }
 
 func tokenize(s string, dividers ...string) []string {
@@ -95,12 +95,12 @@ func tokenize(s string, dividers ...string) []string {
 //
 //	a := carapace.ActionValues("A/B/C", "A/C", "B/C", "C").Invoke(c)
 //	b := a.ToMultiPartsA("/") // completes segments separately (first one is ["A/", "B/", "C"])
-func (a InvokedAction) ToMultiPartsA(dividers ...string) Action {
+func (ia InvokedAction) ToMultiPartsA(dividers ...string) Action {
 	return ActionCallback(func(c Context) Action {
 		splittedCV := tokenize(c.Value, dividers...)
 
 		uniqueVals := make(map[string]common.RawValue)
-		for _, val := range a.rawValues {
+		for _, val := range ia.action.rawValues {
 			if match.HasPrefix(val.Value, c.Value) {
 				if splitted := tokenize(val.Value, dividers...); len(splitted) >= len(splittedCV) {
 					v := strings.Join(splitted[:len(splittedCV)], "")
@@ -145,14 +145,14 @@ func (a InvokedAction) ToMultiPartsA(dividers ...string) Action {
 	})
 }
 
-func (a InvokedAction) value(shell string, value string) string {
-	return _shell.Value(shell, value, a.meta, a.rawValues)
+func (ia InvokedAction) value(shell string, value string) string {
+	return _shell.Value(shell, value, ia.action.meta, ia.action.rawValues)
 }
 
 func init() {
 	common.FromInvokedAction = func(i interface{}) (common.Meta, common.RawValues) {
-		if a, ok := i.(InvokedAction); ok {
-			return a.meta, a.rawValues
+		if invoked, ok := i.(InvokedAction); ok {
+			return invoked.action.meta, invoked.action.rawValues
 		}
 		return common.Meta{}, nil
 	}
diff --git a/storage.go b/storage.go
index b937885..e1106a4 100644
--- a/storage.go
+++ b/storage.go
@@ -103,8 +103,8 @@ func (s _storage) getFlag(cmd *cobra.Command, name string) Action {
 
 		return ActionCallback(func(c Context) Action { // TODO verify order of execution is correct
 			invoked := a.Invoke(c)
-			if invoked.meta.Usage == "" {
-				invoked.meta.Usage = flag.Usage
+			if invoked.action.meta.Usage == "" {
+				invoked.action.meta.Usage = flag.Usage
 			}
 			return invoked.ToA()
 		})
@@ -177,8 +177,8 @@ func (s _storage) getPositional(cmd *cobra.Command, index int) Action {
 
 	return ActionCallback(func(c Context) Action {
 		invoked := a.Invoke(c)
-		if invoked.meta.Usage == "" && len(strings.Fields(cmd.Use)) > 1 {
-			invoked.meta.Usage = cmd.Use
+		if invoked.action.meta.Usage == "" && len(strings.Fields(cmd.Use)) > 1 {
+			invoked.action.meta.Usage = cmd.Use
 		}
 		return invoked.ToA()
 	})


Test patch:
diff --git a/action_test.go b/action_test.go
index 1c67c56..0cd9f7c 100644
--- a/action_test.go
+++ b/action_test.go
@@ -18,24 +18,24 @@ func init() {
 }
 
 func assertEqual(t *testing.T, expected, actual InvokedAction) {
-	sort.Sort(common.ByValue(expected.rawValues))
-	sort.Sort(common.ByValue(actual.rawValues))
+	sort.Sort(common.ByValue(expected.action.rawValues))
+	sort.Sort(common.ByValue(actual.action.rawValues))
 
-	e, _ := json.MarshalIndent(expected.rawValues, "", "  ")
-	a, _ := json.MarshalIndent(actual.rawValues, "", "  ")
+	e, _ := json.MarshalIndent(expected.action.rawValues, "", "  ")
+	a, _ := json.MarshalIndent(actual.action.rawValues, "", "  ")
 	assert.Equal(t, string(e), string(a))
 
-	eMeta, _ := json.MarshalIndent(expected.meta, "", "  ")
-	aMeta, _ := json.MarshalIndent(actual.meta, "", "  ")
+	eMeta, _ := json.MarshalIndent(expected.action.meta, "", "  ")
+	aMeta, _ := json.MarshalIndent(actual.action.meta, "", "  ")
 	assert.Equal(t, string(eMeta), string(aMeta))
 }
 
 func assertNotEqual(t *testing.T, expected, actual InvokedAction) {
-	sort.Sort(common.ByValue(expected.rawValues))
-	sort.Sort(common.ByValue(actual.rawValues))
+	sort.Sort(common.ByValue(expected.action.rawValues))
+	sort.Sort(common.ByValue(actual.action.rawValues))
 
-	e, _ := json.MarshalIndent(expected.rawValues, "", "  ")
-	a, _ := json.MarshalIndent(actual.rawValues, "", "  ")
+	e, _ := json.MarshalIndent(expected.action.rawValues, "", "  ")
+	a, _ := json.MarshalIndent(actual.action.rawValues, "", "  ")
 
 	if string(e) == string(a) {
 		t.Errorf("should differ:\n%v", a)
@@ -89,7 +89,7 @@ func TestSkipCache(t *testing.T) {
 	if !a.meta.Messages.IsEmpty() {
 		t.Fatal("uninvoked action should not contain messages")
 	}
-	if a.Invoke(Context{}).meta.Messages.IsEmpty() {
+	if a.Invoke(Context{}).action.meta.Messages.IsEmpty() {
 		t.Fatal("invoked action should contain messages")
 	}
 }
@@ -108,7 +108,7 @@ func TestNoSpace(t *testing.T) {
 	if a.meta.Nospace.Matches("x") {
 		t.Fatal("uninvoked nospace should not match")
 	}
-	if !a.Invoke(Context{}).meta.Nospace.Matches("x") {
+	if !a.Invoke(Context{}).action.meta.Nospace.Matches("x") {
 		t.Fatal("invoked nospace should match")
 	}
 }