1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-08-02 11:38:30 -04:00

Compare commits

..

7 Commits

Author SHA1 Message Date
purian23 8d94117a69 Cleanup 2026-06-12 10:56:16 -04:00
purian23 92569d8b4d Refactor connected chrome rendering & remove legacy components 2026-06-12 10:56:16 -04:00
purian23 fdee09b583 refactor: enhance plugin visibility w/bar reveal state 2026-06-12 10:56:16 -04:00
purian23 b60af507d7 refactor: implement keyboard focus management 2026-06-12 10:56:16 -04:00
purian23 2cc12b70d2 Update frameBlur performance 2026-06-12 10:56:15 -04:00
purian23 2df1dfe0bd Refactor shadow handling & improve connected chrome rendering 2026-06-12 10:56:15 -04:00
purian23 abf084eea2 refactor(framemode): connected surfaces 2026-06-12 10:56:15 -04:00
672 changed files with 22524 additions and 92845 deletions
+23 -135
View File
@@ -2,16 +2,15 @@
name: dms-plugin-dev name: dms-plugin-dev
description: > description: >
Develop plugins for DankMaterialShell (DMS), a QML-based Linux desktop shell built on Develop plugins for DankMaterialShell (DMS), a QML-based Linux desktop shell built on
Quickshell. Supports five plugin types: widget (bar + Control Center), daemon (background Quickshell. Supports four plugin types: widget (bar + Control Center), daemon (background
service), launcher (search + actions), desktop (draggable desktop widgets), and composite service), launcher (search + actions), and desktop (draggable desktop widgets). Covers
(multi-surface). Covers manifest creation, QML component development, startup checks, manifest creation, QML component development, settings UI, data persistence, theme
settings UI, data persistence, theme integration, PopoutService usage, IPC runtime integration, PopoutService usage, and external command execution. Use when the user wants
discovery, and external command execution. Use when the user wants to create, modify, to create, modify, or debug a DMS plugin, or asks about the DMS plugin API.
or debug a DMS plugin, or asks about the DMS plugin API.
compatibility: Designed for Claude Code (or similar products) compatibility: Designed for Claude Code (or similar products)
metadata: metadata:
author: DankMaterialShell author: DankMaterialShell
version: "1.1" version: "1.0"
domain: qml-desktop-development domain: qml-desktop-development
framework: DankMaterialShell framework: DankMaterialShell
languages: qml, javascript languages: qml, javascript
@@ -38,15 +37,14 @@ integrations, and desktop widgets. Plugins are QML components discovered from
**Plugin registry:** Community plugins are available at https://plugins.danklinux.com/ **Plugin registry:** Community plugins are available at https://plugins.danklinux.com/
**Five plugin types:** **Four plugin types:**
| Type | Purpose | Base Component | Bar pills | CC integration | | Type | Purpose | Base Component | Bar pills | CC integration |
|-------------|--------------------------------|----------------------------|-----------|----------------| |------------|--------------------------------|----------------------------|-----------|----------------|
| `widget` | Bar widget + popout | `PluginComponent` | Yes | Yes | | `widget` | Bar widget + popout | `PluginComponent` | Yes | Yes |
| `daemon` | Background service | `PluginComponent` (no UI) | No | Optional | | `daemon` | Background service | `PluginComponent` (no UI) | No | Optional |
| `launcher` | Searchable items in launcher | `Item` | No | No | | `launcher` | Searchable items in launcher | `Item` | No | No |
| `desktop` | Draggable desktop widget | `DesktopPluginComponent` | No | No | | `desktop` | Draggable desktop widget | `DesktopPluginComponent` | No | No |
| `composite` | Multi-surface plugin | One component per surface | Optional | Optional |
## Step 1: Determine Plugin Type ## Step 1: Determine Plugin Type
@@ -60,9 +58,6 @@ Choose the type based on what the plugin does:
with trigger-based filtering (e.g., type `=` for calculator, `:` for emoji). with trigger-based filtering (e.g., type `=` for calculator, `:` for emoji).
- **Shows on the desktop background?** - Use `desktop`. Draggable, resizable widget on the - **Shows on the desktop background?** - Use `desktop`. Draggable, resizable widget on the
desktop layer. desktop layer.
- **Needs multiple surfaces?** - Use `composite`. A single plugin that registers any combination
of the above (e.g., a daemon + bar widget + desktop widget). Each surface gets its own
QML component file.
## Step 2: Create the Manifest ## Step 2: Create the Manifest
@@ -83,7 +78,7 @@ Create `plugin.json` in your plugin directory. See [plugin-manifest-reference.md
} }
``` ```
**With settings, startup check, and permissions:** **With settings and permissions:**
```json ```json
{ {
@@ -97,31 +92,7 @@ Create `plugin.json` in your plugin directory. See [plugin-manifest-reference.md
"component": "./YourWidget.qml", "component": "./YourWidget.qml",
"icon": "extension", "icon": "extension",
"settings": "./Settings.qml", "settings": "./Settings.qml",
"startupCheck": "./StartupCheck.qml",
"requires_dms": ">=0.1.0", "requires_dms": ">=0.1.0",
"dependencies": ["mytool"],
"permissions": ["settings_read", "settings_write"]
}
```
**Composite plugin (multi-surface):**
```json
{
"id": "myComposite",
"name": "My Composite Plugin",
"description": "Daemon + widget + desktop from one plugin",
"version": "1.0.0",
"author": "Your Name",
"type": "composite",
"capabilities": ["daemon", "dankbar-widget", "desktop-widget"],
"icon": "extension",
"components": {
"daemon": "./MyDaemon.qml",
"widget": "./MyBarWidget.qml",
"desktop": "./MyDesktopWidget.qml"
},
"settings": "./Settings.qml",
"permissions": ["settings_read", "settings_write"] "permissions": ["settings_read", "settings_write"]
} }
``` ```
@@ -129,11 +100,9 @@ Create `plugin.json` in your plugin directory. See [plugin-manifest-reference.md
**Key rules:** **Key rules:**
- `id` must be camelCase, matching pattern `^[a-zA-Z][a-zA-Z0-9]*$` - `id` must be camelCase, matching pattern `^[a-zA-Z][a-zA-Z0-9]*$`
- `version` must be semver (e.g., `1.0.0`) - `version` must be semver (e.g., `1.0.0`)
- Provide either `component` (single-surface) or `components` (multi-surface), not both - `component` must start with `./` and end with `.qml`
- `component` / component paths must start with `./` and end with `.qml` - `type: "launcher"` requires a `trigger` field
- `type: "launcher"` (or a `components` object with a `launcher` key) requires a `trigger` field
- `settings_write` permission is **required** if the plugin has a settings component - `settings_write` permission is **required** if the plugin has a settings component
- `dependencies` replaces the deprecated `requires` field
## Step 3: Create the Main Component ## Step 3: Create the Main Component
@@ -280,69 +249,7 @@ PluginComponent {
See [daemon-plugin-guide.md](references/daemon-plugin-guide.md) for event-driven patterns and process execution. See [daemon-plugin-guide.md](references/daemon-plugin-guide.md) for event-driven patterns and process execution.
### Composite ## Step 4: Add Settings (Optional)
For composite plugins, create a separate QML file per surface. Each surface uses the same
base component as the corresponding single-surface type (PluginComponent for widget/daemon,
Item for launcher, etc.). All surfaces share the same `pluginId` and `pluginService`.
```
MyCompositePlugin/
plugin.json
MyBarWidget.qml # PluginComponent (widget surface)
MyDaemon.qml # PluginComponent (daemon surface)
MyDesktopWidget.qml # Item with desktop widget properties
Settings.qml # Shared settings for all surfaces
```
Use `pluginService.pluginHasSurface(pluginId, "widget")` to check whether a specific surface
is registered for a plugin at runtime.
## Step 4: Add Startup Check (Optional)
Gate plugin activation on dependency checks by providing a `startupCheck` component. This
runs before the plugin loads and blocks activation if a required tool or condition is missing.
Create a `StartupCheck.qml` (non-visual QtObject):
```qml
import QtQuick
import qs.Common
QtObject {
function check(done) {
Proc.runCommand("myPlugin.depCheck", ["sh", "-c", "command -v mytool"], (stdout, exitCode) => {
if (exitCode === 0) {
done(null);
return;
}
done({
"title": I18n.tr("mytool is required"),
"details": I18n.tr("Install 'mytool' and re-enable this plugin.")
});
});
}
}
```
The `done` callback accepts:
- `null` - allow activation
- A string - block with a short error message
- `{ title, details }` - block with a title and expandable details body
A synchronous variant (no `done` parameter, return the result directly) is also supported.
Failed checks show a toast error and store the error in `pluginService.pluginLoadErrors`.
Add to your manifest:
```json
{
"startupCheck": "./StartupCheck.qml",
"dependencies": ["mytool"]
}
```
## Step 5: Add Settings (Optional)
Wrap settings in `PluginSettings` with your `pluginId`. All settings auto-save and auto-load. Wrap settings in `PluginSettings` with your `pluginId`. All settings auto-save and auto-load.
@@ -386,7 +293,7 @@ See [settings-components-reference.md](references/settings-components-reference.
**Important:** Your plugin must declare `"permissions": ["settings_write"]` in plugin.json, or the settings UI will show an error. **Important:** Your plugin must declare `"permissions": ["settings_write"]` in plugin.json, or the settings UI will show an error.
## Step 6: Use Data Persistence ## Step 5: Use Data Persistence
Three tiers of persistence: Three tiers of persistence:
@@ -395,7 +302,6 @@ Three tiers of persistence:
| `pluginService.savePluginData(id, key, val)` / `loadPluginData(id, key, default)` | Yes (settings.json) | User preferences, config | | `pluginService.savePluginData(id, key, val)` / `loadPluginData(id, key, default)` | Yes (settings.json) | User preferences, config |
| `pluginService.savePluginState(id, key, val)` / `loadPluginState(id, key, default)` | Yes (separate state file) | Runtime state, history, cache | | `pluginService.savePluginState(id, key, val)` / `loadPluginState(id, key, default)` | Yes (separate state file) | Runtime state, history, cache |
| `PluginGlobalVar { varName; defaultValue; value; set() }` | No (runtime only) | Cross-instance shared state | | `PluginGlobalVar { varName; defaultValue; value; set() }` | No (runtime only) | Cross-instance shared state |
| `pluginService.getPluginPath(id)` | N/A | Get the plugin's installation directory path |
- `pluginData` is a reactive property on PluginComponent, auto-loaded from settings - `pluginData` is a reactive property on PluginComponent, auto-loaded from settings
- React to settings changes with `Connections { target: pluginService; function onPluginDataChanged(id) { ... } }` - React to settings changes with `Connections { target: pluginService; function onPluginDataChanged(id) { ... } }`
@@ -403,7 +309,7 @@ Three tiers of persistence:
See [data-persistence-guide.md](references/data-persistence-guide.md) for details and examples. See [data-persistence-guide.md](references/data-persistence-guide.md) for details and examples.
## Step 7: Theme Integration ## Step 6: Theme Integration
Always use `Theme.*` properties from `qs.Common` - never hardcode colors or sizes. Always use `Theme.*` properties from `qs.Common` - never hardcode colors or sizes.
@@ -418,7 +324,7 @@ Always use `Theme.*` properties from `qs.Common` - never hardcode colors or size
See [theme-reference.md](references/theme-reference.md) for the complete property list. See [theme-reference.md](references/theme-reference.md) for the complete property list.
## Step 8: Add Popout Content (Widgets Only) ## Step 7: Add Popout Content (Widgets Only)
Add a popout that opens when the bar pill is clicked: Add a popout that opens when the bar pill is clicked:
@@ -454,7 +360,7 @@ PluginComponent {
Calculate available content height: `popoutHeight - headerHeight - detailsHeight - spacing` Calculate available content height: `popoutHeight - headerHeight - detailsHeight - spacing`
## Step 9: Control Center Integration (Widgets Only) ## Step 8: Control Center Integration (Widgets Only)
Add your widget to the Control Center grid: Add your widget to the Control Center grid:
@@ -483,7 +389,7 @@ PluginComponent {
**CC sizing:** 25% width = SmallToggleButton (icon only), 50% width = ToggleButton or CompoundPill (if ccDetailContent is defined). **CC sizing:** 25% width = SmallToggleButton (icon only), 50% width = ToggleButton or CompoundPill (if ccDetailContent is defined).
## Step 10: External Commands and Clipboard ## Step 9: External Commands and Clipboard
**Run commands and capture output:** **Run commands and capture output:**
@@ -514,33 +420,18 @@ Quickshell.execDetached(["dms", "cl", "copy", textToCopy])
**Do NOT use** `globalThis.clipboard` or browser JavaScript APIs - they don't exist in the QML runtime. **Do NOT use** `globalThis.clipboard` or browser JavaScript APIs - they don't exist in the QML runtime.
## Step 11: Validate and Test ## Step 10: Validate and Test
1. Validate `plugin.json` against the schema at [assets/plugin-schema.json](assets/plugin-schema.json) 1. Validate `plugin.json` against the schema at [assets/plugin-schema.json](assets/plugin-schema.json)
2. Run the shell with verbose output: `qs -v -p $CONFIGPATH/quickshell/dms/shell.qml` 2. Run the shell with verbose output: `qs -v -p $CONFIGPATH/quickshell/dms/shell.qml`
3. Open Settings > Plugins > Scan for Plugins 3. Open Settings > Plugins > Scan for Plugins
4. Enable your plugin and add it to the DankBar layout 4. Enable your plugin and add it to the DankBar layout
**Runtime plugin discovery via IPC:**
Plugins can be scanned, rescanned, and reloaded at runtime without restarting the shell:
```bash
dms ipc plugin-scan scan # Trigger a full rescan of all plugin directories
dms ipc plugin-scan rescan <id> # Force rescan of a specific plugin
dms ipc plugin-scan reload <id> # Force reload of a loaded plugin
dms ipc plugin-scan list # List all known plugins (TSV: id, loaded, type, name)
dms ipc plugin-scan status <id> # Get status of a specific plugin (TSV: loaded, type, error)
```
Plugin IDs are validated against `^[a-zA-Z0-9_\-:]{1,64}$`.
**Common issues:** **Common issues:**
- Plugin not detected: check plugin.json syntax with `jq . plugin.json` - Plugin not detected: check plugin.json syntax with `jq . plugin.json`
- Widget not showing: ensure it's enabled AND added to a DankBar section - Widget not showing: ensure it's enabled AND added to a DankBar section
- Settings error: verify `settings_write` permission is declared - Settings error: verify `settings_write` permission is declared
- Data not persisting: check pluginService injection and permissions - Data not persisting: check pluginService injection and permissions
- Startup check failing: check `pluginService.pluginLoadErrors` or run `dms ipc plugin-scan status <id>`
## Common Mistakes ## Common Mistakes
@@ -554,9 +445,6 @@ Plugin IDs are validated against `^[a-zA-Z0-9_\-:]{1,64}$`.
8. **Forgetting `categories` in launcher items** - Items won't display without it 8. **Forgetting `categories` in launcher items** - Items won't display without it
9. **Not handling null pluginService** - Always use optional chaining or null checks 9. **Not handling null pluginService** - Always use optional chaining or null checks
10. **Using `PluginComponent` for launchers** - Launchers use plain `Item`, not `PluginComponent` 10. **Using `PluginComponent` for launchers** - Launchers use plain `Item`, not `PluginComponent`
11. **Using `requires` instead of `dependencies`** - `requires` is deprecated; use `dependencies`
12. **Providing both `component` and `components`** - Use one or the other, not both
13. **Missing `trigger` on composite with launcher surface** - Still required when `components` has a `launcher` key
## Quick Reference: Imports ## Quick Reference: Imports
@@ -11,7 +11,8 @@
"version", "version",
"author", "author",
"type", "type",
"capabilities" "capabilities",
"component"
], ],
"properties": { "properties": {
"id": { "id": {
@@ -41,8 +42,8 @@
}, },
"type": { "type": {
"type": "string", "type": "string",
"description": "Plugin type. Use 'composite' (or any value) together with 'components' to provide multiple surfaces from one plugin.", "description": "Plugin type",
"enum": ["widget", "daemon", "launcher", "desktop", "composite"] "enum": ["widget", "daemon", "launcher", "desktop"]
}, },
"capabilities": { "capabilities": {
"type": "array", "type": "array",
@@ -54,37 +55,9 @@
}, },
"component": { "component": {
"type": "string", "type": "string",
"description": "Relative path to main QML component file. Required unless 'components' is provided.", "description": "Relative path to main QML component file",
"pattern": "^\\./.*\\.qml$" "pattern": "^\\./.*\\.qml$"
}, },
"components": {
"type": "object",
"description": "Map of surface name to relative QML component path, for multi-surface (composite) plugins. Provide any subset of surfaces; each is loaded independently.",
"properties": {
"widget": {
"type": "string",
"description": "Bar/Control Center widget component (PluginComponent)",
"pattern": "^\\./.*\\.qml$"
},
"desktop": {
"type": "string",
"description": "Desktop widget component",
"pattern": "^\\./.*\\.qml$"
},
"daemon": {
"type": "string",
"description": "Background daemon component (instantiated once)",
"pattern": "^\\./.*\\.qml$"
},
"launcher": {
"type": "string",
"description": "Launcher provider component (requires 'trigger')",
"pattern": "^\\./.*\\.qml$"
}
},
"additionalProperties": false,
"minProperties": 1
},
"trigger": { "trigger": {
"type": "string", "type": "string",
"description": "Trigger string for launcher activation (required for launcher type)" "description": "Trigger string for launcher activation (required for launcher type)"
@@ -98,26 +71,14 @@
"description": "Path to settings component QML file", "description": "Path to settings component QML file",
"pattern": "^\\./.*\\.qml$" "pattern": "^\\./.*\\.qml$"
}, },
"startupCheck": {
"type": "string",
"description": "Path to a non-visual (QtObject) component exposing a check(done) function that gates activation. done(null) allows; done(error) blocks, where error is a string or { title, details }.",
"pattern": "^\\./.*\\.qml$"
},
"requires_dms": { "requires_dms": {
"type": "string", "type": "string",
"description": "Minimum DMS version requirement (e.g., '>=0.1.18', '>0.1.0')", "description": "Minimum DMS version requirement (e.g., '>=0.1.18', '>0.1.0')",
"pattern": "^(>=?|<=?|=|>|<)\\d+\\.\\d+\\.\\d+$" "pattern": "^(>=?|<=?|=|>|<)\\d+\\.\\d+\\.\\d+$"
}, },
"dependencies": {
"type": "array",
"description": "Array of required system tools/dependencies (registry metadata)",
"items": {
"type": "string"
}
},
"requires": { "requires": {
"type": "array", "type": "array",
"description": "Deprecated alias for 'dependencies'.", "description": "Array of required system tools/dependencies",
"items": { "items": {
"type": "string" "type": "string"
} }
@@ -148,29 +109,6 @@
"then": { "then": {
"required": ["trigger"] "required": ["trigger"]
} }
},
{
"if": {
"required": ["components"],
"properties": {
"components": {
"required": ["launcher"]
}
}
},
"then": {
"required": ["trigger"]
}
},
{
"anyOf": [
{
"required": ["component"]
},
{
"required": ["components"]
}
]
} }
], ],
"additionalProperties": true "additionalProperties": true
@@ -166,16 +166,6 @@ function increment() {
| Cross-instance sync (multi-monitor data) | `PluginGlobalVar` or `getGlobalVar`/`setGlobalVar` | No (runtime only) | All instances | | Cross-instance sync (multi-monitor data) | `PluginGlobalVar` or `getGlobalVar`/`setGlobalVar` | No (runtime only) | All instances |
| Quick reactive reads from settings | `pluginData` property | N/A (read-only) | Per instance | | Quick reactive reads from settings | `pluginData` property | N/A (read-only) | Per instance |
## Plugin Path
Retrieve a plugin's installation directory at runtime:
```qml
var dir = pluginService.getPluginPath(pluginId)
```
Returns the absolute path to the plugin's directory (e.g., `~/.config/DankMaterialShell/plugins/MyPlugin`), or an empty string if the plugin is not found. Useful for loading bundled assets (images, data files) relative to the plugin's location.
## Important Notes ## Important Notes
1. **pluginData is reactive** - bindings update automatically when data changes 1. **pluginData is reactive** - bindings update automatically when data changes
@@ -9,22 +9,15 @@
| `description` | string | Short description (shown in UI) | Non-empty | | `description` | string | Short description (shown in UI) | Non-empty |
| `version` | string | Semantic version | Pattern `^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$` | | `version` | string | Semantic version | Pattern `^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$` |
| `author` | string | Creator name or email | Non-empty | | `author` | string | Creator name or email | Non-empty |
| `type` | string | Plugin type | One of: `widget`, `daemon`, `launcher`, `desktop`, `composite` | | `type` | string | Plugin type | One of: `widget`, `daemon`, `launcher`, `desktop` |
| `capabilities` | array | Plugin capabilities | At least 1 string item | | `capabilities` | array | Plugin capabilities | At least 1 string item |
| `component` | string | Path to main QML file | Must start with `./`, end with `.qml` |
One of `component` or `components` is required (not both):
| Field | Type | Description | Validation |
|-------|------|-------------|------------|
| `component` | string | Path to main QML file (single-surface plugins) | Must start with `./`, end with `.qml` |
| `components` | object | Map of surface name to QML path (multi-surface plugins) | At least 1 entry; keys: `widget`, `desktop`, `daemon`, `launcher` |
## Conditional Requirements ## Conditional Requirements
| Condition | Required Field | Description | | Condition | Required Field | Description |
|-----------|---------------|-------------| |-----------|---------------|-------------|
| `type: "launcher"` | `trigger` | Trigger string for launcher activation (e.g., `=`, `#`, `!`) | | `type: "launcher"` | `trigger` | Trigger string for launcher activation (e.g., `=`, `#`, `!`) |
| `components` has `launcher` key | `trigger` | Same requirement applies to composite plugins with a launcher surface |
## Optional Fields ## Optional Fields
@@ -32,10 +25,8 @@ One of `component` or `components` is required (not both):
|-------|------|-------------| |-------|------|-------------|
| `icon` | string | Material Design icon name (displayed in plugin list UI) | | `icon` | string | Material Design icon name (displayed in plugin list UI) |
| `settings` | string | Path to settings QML file (must start with `./`, end with `.qml`) | | `settings` | string | Path to settings QML file (must start with `./`, end with `.qml`) |
| `startupCheck` | string | Path to a QtObject component that gates plugin activation via a `check(done)` function (must start with `./`, end with `.qml`). See Startup Check section below. |
| `requires_dms` | string | Minimum DMS version (e.g., `>=0.1.18`), pattern `^(>=?\|<=?\|=\|>\|<)\d+\.\d+\.\d+$` | | `requires_dms` | string | Minimum DMS version (e.g., `>=0.1.18`), pattern `^(>=?\|<=?\|=\|>\|<)\d+\.\d+\.\d+$` |
| `dependencies` | array | System tool dependencies (e.g., `["curl", "jq"]`). Registry metadata. | | `requires` | array | System tool dependencies (e.g., `["curl", "jq"]`) |
| `requires` | array | Deprecated alias for `dependencies` |
| `permissions` | array | Required permissions | | `permissions` | array | Required permissions |
| `trigger` | string | Launcher trigger string (required for launcher type) | | `trigger` | string | Launcher trigger string (required for launcher type) |
@@ -62,65 +53,6 @@ Capabilities are free-form strings that describe what the plugin does. Common va
- `ai` - AI/LLM integration - `ai` - AI/LLM integration
- `slideout` - uses slideout panel - `slideout` - uses slideout panel
## Startup Check
The `startupCheck` field points to a non-visual `QtObject` component that gates plugin activation on dependency checks. The component must expose a `check(done)` function:
```qml
import QtQuick
import qs.Common
QtObject {
function check(done) {
Proc.runCommand("myPlugin.depCheck", ["sh", "-c", "command -v mytool"], (stdout, exitCode) => {
if (exitCode === 0) {
done(null);
return;
}
done({
"title": I18n.tr("mytool is required"),
"details": I18n.tr("Install 'mytool' and re-enable this plugin.")
});
});
}
}
```
The `done` callback accepts:
- `null` - allow activation
- A string - block with a short error message
- `{ title, details }` - block with a title and expandable details
A synchronous variant (no `done` parameter, return the result directly) is also supported.
Failed startup checks show a toast error and store the error in `pluginService.pluginLoadErrors`.
## Components (Composite Plugins)
The `components` field maps surface names to QML paths, allowing a single plugin to register multiple surfaces:
```json
{
"id": "myComposite",
"name": "My Composite Plugin",
"description": "Daemon + widget + desktop from one plugin",
"version": "1.0.0",
"author": "Developer Name",
"type": "composite",
"capabilities": ["daemon", "dankbar-widget", "desktop-widget"],
"icon": "extension",
"components": {
"daemon": "./MyDaemon.qml",
"widget": "./MyBarWidget.qml",
"desktop": "./MyDesktopWidget.qml"
},
"settings": "./Settings.qml",
"permissions": ["settings_read", "settings_write"]
}
```
Valid surface keys: `widget`, `desktop`, `daemon`, `launcher`. Provide any subset. Each surface is loaded independently in the appropriate registry.
## Complete Example ## Complete Example
```json ```json
@@ -135,9 +67,8 @@ Valid surface keys: `widget`, `desktop`, `daemon`, `launcher`. Provide any subse
"component": "./MyWidget.qml", "component": "./MyWidget.qml",
"icon": "extension", "icon": "extension",
"settings": "./Settings.qml", "settings": "./Settings.qml",
"startupCheck": "./StartupCheck.qml",
"requires_dms": ">=0.1.18", "requires_dms": ">=0.1.18",
"dependencies": ["curl", "jq"], "requires": ["curl", "jq"],
"permissions": ["settings_read", "settings_write", "process", "network"] "permissions": ["settings_read", "settings_write", "process", "network"]
} }
``` ```
@@ -235,12 +235,10 @@ Conditionally show/hide the bar pill:
```qml ```qml
PluginComponent { PluginComponent {
visibilityCommand: "pgrep -x myapp" visibilityCommand: "pgrep -x myapp"
visibilityInterval: 5 // seconds between checks visibilityInterval: 5 // seconds between checks; polling pauses while the bar is hidden
} }
``` ```
**Bar reveal optimization:** The visibility timer automatically pauses while the bar is hidden (auto-hide mode) and resumes checks when the bar is revealed. This is handled via the internal `_barRevealed` property - no plugin code needed. Plugins using `visibilityCommand` with `visibilityInterval` benefit from this automatically.
## Popout Namespace ## Popout Namespace
For plugins with multiple popout instances, use `layerNamespacePlugin` to isolate popout state: For plugins with multiple popout instances, use `layerNamespacePlugin` to isolate popout state:
-1
View File
@@ -24,7 +24,6 @@ jobs:
check-updates: check-updates:
name: Check for updates name: Check for updates
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'AvengeMedia/DankMaterialShell'
outputs: outputs:
has_updates: ${{ steps.check.outputs.has_updates }} has_updates: ${{ steps.check.outputs.has_updates }}
-1
View File
@@ -24,7 +24,6 @@ jobs:
check-updates: check-updates:
name: Check package/series updates name: Check package/series updates
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'AvengeMedia/DankMaterialShell'
outputs: outputs:
has_updates: ${{ steps.check.outputs.has_updates }} has_updates: ${{ steps.check.outputs.has_updates }}
-268
View File
@@ -1,268 +0,0 @@
name: Void Linux XBPS Repository
on:
schedule:
- cron: "0 2,5,14,17,20,23 * * *" # 9am, 12pm, 3pm, 6pm, 9pm, 12am EST (UTC times shown)
release:
types: [published]
workflow_dispatch:
inputs:
force_rebuild:
description: 'Force rebuilding packages even if they already exist in the repository'
type: boolean
required: false
default: false
build_git:
description: 'Build dms-git package'
type: boolean
required: false
default: true
build_dms:
description: 'Build stable dms package'
type: boolean
required: false
default: true
build_greeter:
description: 'Build stable dms-greeter package'
type: boolean
required: false
default: true
permissions:
contents: write
jobs:
build-and-deploy:
name: Build & Deploy XBPS packages
runs-on: ubuntu-latest
if: github.repository == 'AvengeMedia/DankMaterialShell'
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Checkout gh-pages branch
run: |
git clone --branch gh-pages https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git gh-pages-repo || {
echo "⚠️ gh-pages branch not found or empty, initializing a new one..."
mkdir gh-pages-repo
cd gh-pages-repo
git init
git checkout -b gh-pages
git remote add origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
cd ..
}
- name: Install XBPS Static Utilities
run: |
mkdir -p ${{ github.workspace }}/xbps
curl -s -L https://repo-default.voidlinux.org/static/xbps-static-latest.x86_64-musl.tar.xz | tar -xJ -C ${{ github.workspace }}/xbps
echo "${{ github.workspace }}/xbps/usr/bin" >> $GITHUB_PATH
- name: Clone void-packages
run: |
git clone --depth=1 https://github.com/void-linux/void-packages.git
- name: Inject templates
run: |
cp -R distro/void/srcpkgs/dms void-packages/srcpkgs/
cp -R distro/void/srcpkgs/dms-greeter void-packages/srcpkgs/
cp -R distro/void/srcpkgs/dms-git void-packages/srcpkgs/
- name: Enable unprivileged user namespaces (Ubuntu 24.04)
run: |
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 || true
- name: Bootstrap xbps-src
run: |
cd void-packages
./xbps-src binary-bootstrap
- name: Configure signing keys and trust
run: |
# Write private key; extract and register the public key
echo "${{ secrets.XBPS_PRIVATE_KEY }}" > /tmp/xbps_privkey.pem
chmod 600 /tmp/xbps_privkey.pem
# Extract public key in PEM format
openssl rsa -in /tmp/xbps_privkey.pem -pubout -out /tmp/dms-key.pub
rm -f /tmp/xbps_privkey.pem
# Compute MD5 fingerprint in colon-separated hex format
FINGERPRINT=$(openssl rsa -pubin -in /tmp/dms-key.pub -outform DER 2>/dev/null | openssl dgst -md5 -c | tr '[:upper:]' '[:lower:]' | awk '{print $NF}')
# Format key in XML property list (plist) format as expected by xbps
mkdir -p /tmp/keys
cat <<EOF > "/tmp/keys/${FINGERPRINT}.plist"
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>public-key</key>
<data>$(base64 -w0 /tmp/dms-key.pub)</data>
<key>public-key-size</key>
<integer>4096</integer>
<key>signature-by</key>
<string>AvengeMedia</string>
</dict>
</plist>
EOF
# Copy keys to all host and chroot trust stores
sudo mkdir -p /var/db/xbps/keys
sudo cp "/tmp/keys/${FINGERPRINT}.plist" "/var/db/xbps/keys/${FINGERPRINT}.plist"
mkdir -p void-packages/masterdir/var/db/xbps/keys
cp "/tmp/keys/${FINGERPRINT}.plist" "void-packages/masterdir/var/db/xbps/keys/${FINGERPRINT}.plist"
mkdir -p void-packages/etc/xbps.d/keys
cp "/tmp/keys/${FINGERPRINT}.plist" "void-packages/etc/xbps.d/keys/${FINGERPRINT}.plist"
mkdir -p void-packages/common/repo-keys
cp "/tmp/keys/${FINGERPRINT}.plist" "void-packages/common/repo-keys/${FINGERPRINT}.plist"
rm -rf /tmp/keys /tmp/dms-key.pub
- name: Configure repositories
run: |
# Append the repository to repos-remote templates so xbps-src translates it automatically
echo "repository=https://avengemedia.github.io/DankLinux/current" >> void-packages/etc/xbps.d/repos-remote.conf
echo "repository=https://avengemedia.github.io/DankLinux/current" >> void-packages/etc/xbps.d/repos-remote-x86_64-multilib.conf
# Add any existing compiled packages to the build cache directory to avoid rebuilds
if [ -d "gh-pages-repo/current" ]; then
mkdir -p void-packages/hostdir/binpkgs
cp -L gh-pages-repo/current/*.xbps void-packages/hostdir/binpkgs/ 2>/dev/null || true
xbps-rindex -a void-packages/hostdir/binpkgs/*.xbps 2>/dev/null || true
fi
- name: Build packages
run: |
mkdir -p gh-pages-repo/current
BUILD_DMS="${{ github.event.inputs.build_dms || 'true' }}"
BUILD_GREETER="${{ github.event.inputs.build_greeter || 'true' }}"
BUILD_GIT="${{ github.event.inputs.build_git || 'true' }}"
FORCE_REBUILD="${{ github.event.inputs.force_rebuild || 'false' }}"
if [ "${{ github.event_name }}" = "schedule" ]; then
BUILD_DMS="false"
BUILD_GREETER="false"
BUILD_GIT="true"
fi
if [ "${{ github.event_name }}" = "release" ]; then
BUILD_DMS="true"
BUILD_GREETER="true"
BUILD_GIT="false"
fi
echo "=== Starting Builds ==="
echo "DMS stable build enabled: $BUILD_DMS"
echo "Greeter stable build enabled: $BUILD_GREETER"
echo "Git build enabled: $BUILD_GIT"
echo "Force rebuild: $FORCE_REBUILD"
cd void-packages
# 1. Build dms-git (development package)
if [ "$BUILD_GIT" = "true" ]; then
# Calculate dynamic git version (tag.commits.hash)
GIT_VER=$(git -C .. describe --tags --always | sed 's/^v//; s/-/./g')
echo "🔨 Preparing dms-git version $GIT_VER"
# Stage source tarball in the xbps-src source cache.
# --transform adds a top-level directory so xbps-src can extract
# into $wrksrc (create_wrksrc=yes handles the rest).
SRC_CACHE="hostdir/sources/dms-git-${GIT_VER}"
mkdir -p "$SRC_CACHE"
tar -czf "${SRC_CACHE}/dms-git-${GIT_VER}.tar.gz" \
--exclude=void-packages \
--exclude=gh-pages-repo \
--exclude=.git \
--exclude=danklinux \
-C .. .
CHECKSUM=$(sha256sum "${SRC_CACHE}/dms-git-${GIT_VER}.tar.gz" | cut -d' ' -f1)
# Dynamically patch template version, checksum, and distfiles
sed -i "s/^version=.*/version=${GIT_VER}/" srcpkgs/dms-git/template
sed -i "s/^checksum=.*/checksum=${CHECKSUM}/" srcpkgs/dms-git/template
sed -i "s|^distfiles=.*|distfiles=\"dms-git-${GIT_VER}.tar.gz\"|" srcpkgs/dms-git/template
EXPECTED_GIT_FILE="dms-git-${GIT_VER}_1.x86_64.xbps"
if [ -f "../gh-pages-repo/current/$EXPECTED_GIT_FILE" ] && [ "$FORCE_REBUILD" != "true" ]; then
echo "✅ $EXPECTED_GIT_FILE already exists, skipping build."
else
echo "🔨 Compiling dms-git..."
./xbps-src pkg dms-git
rm -f "../gh-pages-repo/current/${EXPECTED_GIT_FILE}"
cp -L hostdir/binpkgs/dms-git-*.xbps ../gh-pages-repo/current/
fi
fi
# 2. Build stable dms package
if [ "$BUILD_DMS" = "true" ]; then
STABLE_VER=$(grep -E '^version=' srcpkgs/dms/template | cut -d= -f2 | tr -d '"')
STABLE_REV=$(grep -E '^revision=' srcpkgs/dms/template | cut -d= -f2 | tr -d '"')
EXPECTED_DMS_FILE="dms-${STABLE_VER}_${STABLE_REV}.x86_64.xbps"
if [ -f "../gh-pages-repo/current/$EXPECTED_DMS_FILE" ] && [ "$FORCE_REBUILD" != "true" ]; then
echo "✅ $EXPECTED_DMS_FILE already exists, skipping build."
else
echo "🔨 Compiling dms ($STABLE_VER)..."
./xbps-src pkg dms
rm -f "../gh-pages-repo/current/${EXPECTED_DMS_FILE}"
cp -L hostdir/binpkgs/dms-${STABLE_VER}_${STABLE_REV}.x86_64.xbps ../gh-pages-repo/current/
fi
fi
# 3. Build stable dms-greeter package
if [ "$BUILD_GREETER" = "true" ]; then
GREETER_VER=$(grep -E '^version=' srcpkgs/dms-greeter/template | cut -d= -f2 | tr -d '"')
GREETER_REV=$(grep -E '^revision=' srcpkgs/dms-greeter/template | cut -d= -f2 | tr -d '"')
EXPECTED_GREETER_FILE="dms-greeter-${GREETER_VER}_${GREETER_REV}.x86_64.xbps"
if [ -f "../gh-pages-repo/current/$EXPECTED_GREETER_FILE" ] && [ "$FORCE_REBUILD" != "true" ]; then
echo "✅ $EXPECTED_GREETER_FILE already exists, skipping build."
else
echo "🔨 Compiling dms-greeter ($GREETER_VER)..."
./xbps-src pkg dms-greeter
rm -f "../gh-pages-repo/current/${EXPECTED_GREETER_FILE}"
cp -L hostdir/binpkgs/dms-greeter-${GREETER_VER}_${GREETER_REV}.x86_64.xbps ../gh-pages-repo/current/
fi
fi
- name: Index and sign repository
run: |
cd gh-pages-repo/current
# Clean up any stale or dangling signature files to prevent O_CREAT ENOENT errors
rm -f *.sig2 *.sig
# Guard: nothing to index if no .xbps files exist
if ! ls *.xbps 1>/dev/null 2>&1; then
echo "⚠️ No .xbps files found to index, skipping."
exit 0
fi
# Regenerate repo index
xbps-rindex -a $(pwd)/*.xbps
# Sign repository
echo "${{ secrets.XBPS_PRIVATE_KEY }}" > /tmp/xbps_privkey.pem
chmod 600 /tmp/xbps_privkey.pem
xbps-rindex --sign --signedby "AvengeMedia <AvengeMedia.US@gmail.com>" --privkey /tmp/xbps_privkey.pem $(pwd)
xbps-rindex --sign-pkg --privkey /tmp/xbps_privkey.pem $(pwd)/*.xbps
rm -f /tmp/xbps_privkey.pem
- name: Deploy to gh-pages branch
run: |
cd gh-pages-repo
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add current/
git diff --quiet && git diff --staged --quiet || (git commit -m "Update XBPS packages [skip ci]" && git push origin gh-pages)
-9
View File
@@ -110,9 +110,6 @@ bin/
# Core dumps # Core dumps
core.* core.*
# prek-installed local git hooks (generated from .pre-commit-config.yaml)
.githooks/
# direnv # direnv
.envrc .envrc
.direnv/ .direnv/
@@ -120,9 +117,3 @@ quickshell/dms-plugins
__pycache__ __pycache__
.vscode/ .vscode/
# Void (xbps) build artifacts
*.xbps
distro/void/temp/
distro/void/hostdir/
distro/void/masterdir*/
-16
View File
@@ -20,22 +20,6 @@ repos:
language: system language: system
files: ^core/.*\.(go|mod|sum)$ files: ^core/.*\.(go|mod|sum)$
pass_filenames: false pass_filenames: false
- repo: local
hooks:
- id: settings-search-index
name: settings search index is up to date
entry: bash -c 'python3 quickshell/translations/extract_settings_index.py >/dev/null || exit 1; if ! git diff --exit-code -- quickshell/translations/settings_search_index.json; then echo "settings_search_index.json is out of date; run quickshell/translations/extract_settings_index.py and stage the result" >&2; exit 1; fi'
language: system
files: ^quickshell/(Modules/Settings/.*\.qml|Modals/Settings/SettingsSidebar\.qml|translations/extract_settings_index\.py)$
pass_filenames: false
- repo: local
hooks:
- id: i18n-term-freeze
name: i18n term freeze (no new I18n.tr/qsTr terms)
entry: python3 quickshell/translations/check_term_freeze.py
language: system
files: ^quickshell/(.*\.qml|translations/(term_freeze\.json|check_term_freeze\.py|extract_translations\.py))$
pass_filenames: false
- repo: local - repo: local
hooks: hooks:
- id: no-console-in-qml - id: no-console-in-qml
+4 -8
View File
@@ -74,12 +74,10 @@ install-icon:
@echo "Icon installed" @echo "Icon installed"
install-desktop: install-desktop:
@echo "Installing desktop entries..." @echo "Installing desktop entry..."
@install -D -m 644 $(ASSETS_DIR)/dms-open.desktop $(APPLICATIONS_DIR)/dms-open.desktop @install -D -m 644 $(ASSETS_DIR)/dms-open.desktop $(APPLICATIONS_DIR)/dms-open.desktop
@install -D -m 644 $(ASSETS_DIR)/com.danklinux.dms.desktop $(APPLICATIONS_DIR)/com.danklinux.dms.desktop
@install -D -m 644 $(ASSETS_DIR)/com.danklinux.dms.notepad.desktop $(APPLICATIONS_DIR)/com.danklinux.dms.notepad.desktop
@update-desktop-database -q $(APPLICATIONS_DIR) 2>/dev/null || true @update-desktop-database -q $(APPLICATIONS_DIR) 2>/dev/null || true
@echo "Desktop entries installed" @echo "Desktop entry installed"
install: install-bin install-shell install-completions install-systemd install-icon install-desktop install: install-bin install-shell install-completions install-systemd install-icon install-desktop
@echo "" @echo ""
@@ -118,12 +116,10 @@ uninstall-icon:
@echo "Icon removed" @echo "Icon removed"
uninstall-desktop: uninstall-desktop:
@echo "Removing desktop entries..." @echo "Removing desktop entry..."
@rm -f $(APPLICATIONS_DIR)/dms-open.desktop @rm -f $(APPLICATIONS_DIR)/dms-open.desktop
@rm -f $(APPLICATIONS_DIR)/com.danklinux.dms.desktop
@rm -f $(APPLICATIONS_DIR)/com.danklinux.dms.notepad.desktop
@update-desktop-database -q $(APPLICATIONS_DIR) 2>/dev/null || true @update-desktop-database -q $(APPLICATIONS_DIR) 2>/dev/null || true
@echo "Desktop entries removed" @echo "Desktop entry removed"
uninstall: uninstall-systemd uninstall-desktop uninstall-icon uninstall-completions uninstall-shell uninstall-bin uninstall: uninstall-systemd uninstall-desktop uninstall-icon uninstall-completions uninstall-shell uninstall-bin
@echo "" @echo ""
-11
View File
@@ -1,11 +0,0 @@
[Desktop Entry]
Type=Application
Name=DankMaterialShell
GenericName=Desktop Shell
Comment=Material 3 inspired shell for Wayland compositors
Exec=dms run
Icon=danklogo
Terminal=false
NoDisplay=true
StartupNotify=false
Categories=Utility;
-12
View File
@@ -1,12 +0,0 @@
[Desktop Entry]
Type=Application
Name=DMS Notepad
GenericName=Text Editor
Comment=Quick notes and text files in the dank desktop shell
Exec=dms ipc call notepad openFile %f
Icon=danklogo
Terminal=false
NoDisplay=true
Categories=Utility;TextEditor;
MimeType=text/plain;text/markdown;
StartupNotify=false
+77 -80
View File
@@ -1,85 +1,82 @@
dir: internal/mocks/{{.InterfaceDirRelative}} with-expecter: true
structname: Mock{{.InterfaceName}} dir: "internal/mocks/{{.InterfaceDirRelative}}"
pkgname: '{{.SrcPackageName}}' mockname: "Mock{{.InterfaceName}}"
filename: 'mock_{{.InterfaceName}}.go' outpkg: "{{.PackageName}}"
template: testify
template-data:
unroll-variadic: true
packages: packages:
github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation:
config:
dir: internal/mocks/geolocation
pkgname: mocks_geolocation
interfaces:
Client: {}
github.com/AvengeMedia/DankMaterialShell/core/internal/server/cups:
config:
dir: internal/mocks/cups
pkgname: mocks_cups
interfaces:
CUPSClientInterface: {}
PkHelper:
config:
dir: internal/mocks/cups_pkhelper
pkgname: mocks_cups_pkhelper
github.com/AvengeMedia/DankMaterialShell/core/internal/server/evdev:
config:
dir: internal/mocks/evdev
pkgname: mocks_evdev
interfaces:
EvdevDevice: {}
github.com/AvengeMedia/DankMaterialShell/core/internal/server/network:
config:
dir: internal/mocks/network
pkgname: mocks_network
interfaces:
Backend: {}
github.com/AvengeMedia/DankMaterialShell/core/internal/server/wlcontext:
config:
dir: internal/mocks/wlcontext
pkgname: mocks_wlcontext
interfaces:
WaylandContext: {}
github.com/AvengeMedia/DankMaterialShell/core/internal/utils:
config:
dir: internal/mocks/utils
pkgname: mocks_utils
interfaces:
AppChecker: {}
github.com/AvengeMedia/DankMaterialShell/core/internal/version:
config:
dir: internal/mocks/version
pkgname: mocks_version
interfaces:
VersionFetcher: {}
github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client:
config:
dir: internal/mocks/wlclient
pkgname: mocks_wlclient
interfaces:
WaylandDisplay: {}
github.com/AvengeMedia/DankMaterialShell/core/internal/plugins:
interfaces:
GitClient: {}
github.com/AvengeMedia/DankMaterialShell/core/internal/server/brightness:
config:
dir: internal/mocks/brightness
pkgname: mocks_brightness
interfaces:
DBusConn: {}
github.com/Wifx/gonetworkmanager/v2: github.com/Wifx/gonetworkmanager/v2:
interfaces: interfaces:
AccessPoint: {} NetworkManager:
ActiveConnection: {} Device:
Connection: {} DeviceWireless:
Device: {} AccessPoint:
DeviceWireless: {} Connection:
IP4Config: {} Settings:
NetworkManager: {} ActiveConnection:
Settings: {} IP4Config:
github.com/godbus/dbus/v5:
interfaces:
BusObject: {}
net: net:
interfaces: interfaces:
Conn: {} Conn:
github.com/AvengeMedia/danklinux/internal/plugins:
interfaces:
GitClient:
github.com/godbus/dbus/v5:
interfaces:
BusObject:
github.com/AvengeMedia/danklinux/internal/server/brightness:
config:
dir: "internal/mocks/brightness"
outpkg: mocks_brightness
interfaces:
DBusConn:
github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation:
config:
dir: "internal/mocks/geolocation"
outpkg: mocks_geolocation
interfaces:
Client:
github.com/AvengeMedia/DankMaterialShell/core/internal/server/network:
config:
dir: "internal/mocks/network"
outpkg: mocks_network
interfaces:
Backend:
github.com/AvengeMedia/DankMaterialShell/core/internal/server/cups:
config:
dir: "internal/mocks/cups"
outpkg: mocks_cups
interfaces:
CUPSClientInterface:
PkHelper:
config:
dir: "internal/mocks/cups_pkhelper"
outpkg: mocks_cups_pkhelper
github.com/AvengeMedia/DankMaterialShell/core/internal/server/evdev:
config:
dir: "internal/mocks/evdev"
outpkg: mocks_evdev
interfaces:
EvdevDevice:
github.com/AvengeMedia/DankMaterialShell/core/internal/version:
config:
dir: "internal/mocks/version"
outpkg: mocks_version
interfaces:
VersionFetcher:
github.com/AvengeMedia/DankMaterialShell/core/internal/server/wlcontext:
config:
dir: "internal/mocks/wlcontext"
outpkg: mocks_wlcontext
interfaces:
WaylandContext:
github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client:
config:
dir: "internal/mocks/wlclient"
outpkg: mocks_wlclient
interfaces:
WaylandDisplay:
github.com/AvengeMedia/DankMaterialShell/core/internal/utils:
config:
dir: "internal/mocks/utils"
outpkg: mocks_utils
interfaces:
AppChecker:
+1 -1
View File
@@ -1,6 +1,6 @@
repos: repos:
- repo: https://github.com/golangci/golangci-lint - repo: https://github.com/golangci/golangci-lint
rev: v2.12.2 rev: v2.10.1
hooks: hooks:
- id: golangci-lint-fmt - id: golangci-lint-fmt
require_serial: true require_serial: true
+2 -5
View File
@@ -10,7 +10,7 @@ Go-based backend for DankMaterialShell providing system integration, IPC, and in
Command-line interface and daemon for shell management and system control. Command-line interface and daemon for shell management and system control.
**dankinstall** **dankinstall**
Distribution-aware installer for deploying DMS and compositor configurations on Arch, Fedora, Debian, Ubuntu, openSUSE, Gentoo, and Void. Supports both an interactive TUI and a headless (unattended) mode via CLI flags. Distribution-aware installer for deploying DMS and compositor configurations on Arch, Fedora, Debian, Ubuntu, openSUSE, and Gentoo. Supports both an interactive TUI and a headless (unattended) mode via CLI flags.
## System Integration ## System Integration
@@ -193,7 +193,7 @@ Set the `DANKINSTALL_LOG_DIR` environment variable to override the log directory
## Supported Distributions ## Supported Distributions
Arch, Fedora, Debian, Ubuntu, openSUSE, Gentoo, Void (and derivatives) Arch, Fedora, Debian, Ubuntu, openSUSE, Gentoo (and derivatives)
**Arch Linux** **Arch Linux**
Uses `pacman` for system packages, builds AUR packages via `makepkg`, no AUR helper dependency. Uses `pacman` for system packages, builds AUR packages via `makepkg`, no AUR helper dependency.
@@ -214,7 +214,4 @@ Most packages available in standard repos. Minimal building required.
**Gentoo** **Gentoo**
Uses Portage with GURU overlay. Automatically configures USE flags. Variable success depending on system configuration. Uses Portage with GURU overlay. Automatically configures USE flags. Variable success depending on system configuration.
**Void Linux**
Uses XBPS with the DMS and DankLinux self-hosted repositories.
See installer output for distribution-specific details during installation. See installer output for distribution-specific details during installation.
-8
View File
@@ -23,8 +23,6 @@ var (
replaceConfigs []string replaceConfigs []string
replaceConfigsAll bool replaceConfigsAll bool
yes bool yes bool
danksearch bool
dankcalendar bool
) )
var rootCmd = &cobra.Command{ var rootCmd = &cobra.Command{
@@ -51,8 +49,6 @@ func init() {
rootCmd.Flags().StringSliceVar(&replaceConfigs, "replace-configs", []string{}, "Deploy only named configs (e.g. niri,ghostty)") rootCmd.Flags().StringSliceVar(&replaceConfigs, "replace-configs", []string{}, "Deploy only named configs (e.g. niri,ghostty)")
rootCmd.Flags().BoolVar(&replaceConfigsAll, "replace-configs-all", false, "Deploy and replace all configurations") rootCmd.Flags().BoolVar(&replaceConfigsAll, "replace-configs-all", false, "Deploy and replace all configurations")
rootCmd.Flags().BoolVarP(&yes, "yes", "y", false, "Auto-confirm all prompts") rootCmd.Flags().BoolVarP(&yes, "yes", "y", false, "Auto-confirm all prompts")
rootCmd.Flags().BoolVar(&danksearch, "danksearch", false, "Install danksearch and enable its user indexing service")
rootCmd.Flags().BoolVar(&dankcalendar, "dankcalendar", false, "Install dankcalendar")
} }
func main() { func main() {
@@ -78,8 +74,6 @@ func runDankinstall(cmd *cobra.Command, args []string) error {
"replace-configs", "replace-configs",
"replace-configs-all", "replace-configs-all",
"yes", "yes",
"danksearch",
"dankcalendar",
} }
var set []string var set []string
for _, name := range headlessOnly { for _, name := range headlessOnly {
@@ -115,8 +109,6 @@ func runHeadless() error {
ReplaceConfigs: replaceConfigs, ReplaceConfigs: replaceConfigs,
ReplaceConfigsAll: replaceConfigsAll, ReplaceConfigsAll: replaceConfigsAll,
Yes: yes, Yes: yes,
DankSearch: danksearch,
DankCalendar: dankcalendar,
} }
runner := headless.NewRunner(cfg) runner := headless.NewRunner(cfg)
+1 -18
View File
@@ -63,15 +63,6 @@ var clipPasteCmd = &cobra.Command{
Run: runClipPaste, Run: runClipPaste,
} }
var clipSendPasteCmd = &cobra.Command{
Use: "send-paste",
Short: "Send a paste keystroke to the focused window",
Long: "Emulate ctrl+v (or ctrl+shift+v with --shift) via a virtual keyboard. Works without server.",
Run: runClipSendPaste,
}
var clipSendPasteShift bool
var clipWatchCmd = &cobra.Command{ var clipWatchCmd = &cobra.Command{
Use: "watch [command]", Use: "watch [command]",
Short: "Watch clipboard for changes", Short: "Watch clipboard for changes",
@@ -225,10 +216,8 @@ func init() {
clipMigrateCmd.Flags().BoolVar(&clipMigrateDelete, "delete", false, "Delete cliphist db after successful migration") clipMigrateCmd.Flags().BoolVar(&clipMigrateDelete, "delete", false, "Delete cliphist db after successful migration")
clipSendPasteCmd.Flags().BoolVarP(&clipSendPasteShift, "shift", "s", false, "Send ctrl+shift+v (terminal paste)")
clipConfigCmd.AddCommand(clipConfigGetCmd, clipConfigSetCmd) clipConfigCmd.AddCommand(clipConfigGetCmd, clipConfigSetCmd)
clipboardCmd.AddCommand(clipCopyCmd, clipPasteCmd, clipSendPasteCmd, clipWatchCmd, clipHistoryCmd, clipGetCmd, clipDeleteCmd, clipClearCmd, clipSearchCmd, clipConfigCmd, clipExportCmd, clipImportCmd, clipMigrateCmd) clipboardCmd.AddCommand(clipCopyCmd, clipPasteCmd, clipWatchCmd, clipHistoryCmd, clipGetCmd, clipDeleteCmd, clipClearCmd, clipSearchCmd, clipConfigCmd, clipExportCmd, clipImportCmd, clipMigrateCmd)
} }
func runClipCopy(cmd *cobra.Command, args []string) { func runClipCopy(cmd *cobra.Command, args []string) {
@@ -325,12 +314,6 @@ func runClipPaste(cmd *cobra.Command, args []string) {
os.Stdout.Write(data) os.Stdout.Write(data)
} }
func runClipSendPaste(cmd *cobra.Command, args []string) {
if err := clipboard.SendPasteKeystroke(clipSendPasteShift); err != nil {
log.Fatalf("send-paste: %v", err)
}
}
func runClipWatch(cmd *cobra.Command, args []string) { func runClipWatch(cmd *cobra.Command, args []string) {
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
defer cancel() defer cancel()
+1 -9
View File
@@ -19,12 +19,7 @@ var (
var colorCmd = &cobra.Command{ var colorCmd = &cobra.Command{
Use: "color", Use: "color",
Short: "Color utilities", Short: "Color utilities",
Long: `Color utilities including picking colors from the screen. Long: "Color utilities including picking colors from the screen",
This is the screen eyedropper CLI. To open the in-shell color modal, use:
dms ipc call color-picker toggle
See: https://danklinux.com/docs/dankmaterialshell/keybinds-ipc`,
} }
var colorPickCmd = &cobra.Command{ var colorPickCmd = &cobra.Command{
@@ -34,9 +29,6 @@ var colorPickCmd = &cobra.Command{
Click on any pixel to capture its color, or press Escape to cancel. Click on any pixel to capture its color, or press Escape to cancel.
This is the screen eyedropper CLI. To open the in-shell color modal, use:
dms ipc call color-picker toggle
Output format flags (mutually exclusive, default: --hex): Output format flags (mutually exclusive, default: --hex):
--hex - Hexadecimal (#RRGGBB) --hex - Hexadecimal (#RRGGBB)
--rgb - RGB values (R G B) --rgb - RGB values (R G B)
+8 -240
View File
@@ -77,15 +77,10 @@ var killCmd = &cobra.Command{
} }
var ipcCmd = &cobra.Command{ var ipcCmd = &cobra.Command{
Use: "ipc", Use: "ipc [target] [function] [args...]",
Short: "Send IPC commands to running DMS shell", Short: "Send IPC commands to running DMS shell",
Long: `Send IPC commands to the running DMS shell.
dms ipc call <target> <function> [args...] invoke a command
dms ipc list list all targets and functions
Full reference: https://danklinux.com/docs/dankmaterialshell/keybinds-ipc`,
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
_ = findConfig(cmd, args)
return getShellIPCCompletions(args, toComplete), cobra.ShellCompDirectiveNoFileComp return getShellIPCCompletions(args, toComplete), cobra.ShellCompDirectiveNoFileComp
}, },
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
@@ -93,21 +88,11 @@ Full reference: https://danklinux.com/docs/dankmaterialshell/keybinds-ipc`,
}, },
} }
var ipcListCmd = &cobra.Command{
Use: "list",
Short: "List all IPC targets and functions",
Run: func(cmd *cobra.Command, args []string) {
printIPCHelp()
},
}
func init() { func init() {
ipcCmd.AddCommand(ipcListCmd)
ipcCmd.SetHelpFunc(func(cmd *cobra.Command, args []string) { ipcCmd.SetHelpFunc(func(cmd *cobra.Command, args []string) {
_ = findConfig(cmd, args)
printIPCHelp() printIPCHelp()
}) })
pluginsUpdateCmd.Flags().BoolP("all", "a", false, "Update all installed plugins")
pluginsUpdateCmd.Flags().Bool("check", false, "Check for available updates without applying them")
} }
var debugSrvCmd = &cobra.Command{ var debugSrvCmd = &cobra.Command{
@@ -186,22 +171,10 @@ var pluginsUninstallCmd = &cobra.Command{
} }
var pluginsUpdateCmd = &cobra.Command{ var pluginsUpdateCmd = &cobra.Command{
Use: "update [plugin-id]", Use: "update <plugin-id>",
Short: "Update a plugin by ID, or all plugins", Short: "Update a plugin by ID",
Long: "Update an installed DMS plugin using its ID (e.g., 'myPlugin'). If --all or -a is specified, all installed plugins will be updated.", Long: "Update an installed DMS plugin using its ID (e.g., 'myPlugin'). Plugin names are also supported.",
Args: func(cmd *cobra.Command, args []string) error { Args: cobra.ExactArgs(1),
updateAll, _ := cmd.Flags().GetBool("all")
if updateAll {
if len(args) > 0 {
return fmt.Errorf("cannot specify plugin ID when using --all/-a")
}
return nil
}
if len(args) != 1 {
return fmt.Errorf("requires exactly 1 arg (plugin ID) or use --all/-a")
}
return nil
},
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) != 0 { if len(args) != 0 {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
@@ -209,26 +182,6 @@ var pluginsUpdateCmd = &cobra.Command{
return getInstalledPluginIDs(), cobra.ShellCompDirectiveNoFileComp return getInstalledPluginIDs(), cobra.ShellCompDirectiveNoFileComp
}, },
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
checkOnly, _ := cmd.Flags().GetBool("check")
updateAll, _ := cmd.Flags().GetBool("all")
if checkOnly {
if updateAll {
if err := checkAllPluginsCLI(); err != nil {
log.Fatalf("Error checking updates: %v", err)
}
return
}
if err := checkPluginCLI(args[0]); err != nil {
log.Fatalf("Error checking update: %v", err)
}
return
}
if updateAll {
if err := updateAllPluginsCLI(); err != nil {
log.Fatalf("Error updating plugins: %v", err)
}
return
}
if err := updatePluginCLI(args[0]); err != nil { if err := updatePluginCLI(args[0]); err != nil {
log.Fatalf("Error updating plugin: %v", err) log.Fatalf("Error updating plugin: %v", err)
} }
@@ -314,13 +267,6 @@ func browsePlugins() error {
return nil return nil
} }
feedback := plugins.FetchFeedback()
nameByID := make(map[string]string, len(pluginList))
for _, plugin := range pluginList {
nameByID[plugin.ID] = plugin.Name
}
fmt.Printf("\nAvailable Plugins (%d):\n\n", len(pluginList)) fmt.Printf("\nAvailable Plugins (%d):\n\n", len(pluginList))
for _, plugin := range pluginList { for _, plugin := range pluginList {
installed, _ := manager.IsInstalled(plugin) installed, _ := manager.IsInstalled(plugin)
@@ -344,26 +290,6 @@ func browsePlugins() error {
if len(plugin.Dependencies) > 0 { if len(plugin.Dependencies) > 0 {
fmt.Printf(" Dependencies: %s\n", strings.Join(plugin.Dependencies, ", ")) fmt.Printf(" Dependencies: %s\n", strings.Join(plugin.Dependencies, ", "))
} }
if fb, ok := feedback[plugin.ID]; ok {
fmt.Printf(" Upvotes: %d\n", fb.Upvotes)
if len(fb.Status) > 0 {
fmt.Printf(" Status: %s\n", strings.Join(fb.Status, ", "))
}
if fb.IssueURL != "" {
fmt.Printf(" Discuss: %s\n", fb.IssueURL)
}
if len(fb.Similar) > 0 {
names := make([]string, len(fb.Similar))
for i, id := range fb.Similar {
if name, ok := nameByID[id]; ok {
names[i] = name
} else {
names[i] = id
}
}
fmt.Printf(" Related: %s\n", strings.Join(names, ", "))
}
}
fmt.Println() fmt.Println()
} }
@@ -404,11 +330,7 @@ func listInstalledPlugins() error {
fmt.Printf("\nInstalled Plugins (%d):\n\n", len(installedNames)) fmt.Printf("\nInstalled Plugins (%d):\n\n", len(installedNames))
for _, id := range installedNames { for _, id := range installedNames {
if plugin, ok := pluginMap[id]; ok { if plugin, ok := pluginMap[id]; ok {
hasUpdateStr := "" fmt.Printf(" %s\n", plugin.Name)
if hasUpdates, _, err := manager.HasUpdates(id, plugin); err == nil && hasUpdates {
hasUpdateStr = " (update available)"
}
fmt.Printf(" %s%s\n", plugin.Name, hasUpdateStr)
fmt.Printf(" ID: %s\n", plugin.ID) fmt.Printf(" ID: %s\n", plugin.ID)
fmt.Printf(" Category: %s\n", plugin.Category) fmt.Printf(" Category: %s\n", plugin.Category)
fmt.Printf(" Author: %s\n", plugin.Author) fmt.Printf(" Author: %s\n", plugin.Author)
@@ -588,160 +510,6 @@ func updatePluginCLI(idOrName string) error {
return nil return nil
} }
func updateAllPluginsCLI() error {
manager, err := plugins.NewManager()
if err != nil {
return fmt.Errorf("failed to create manager: %w", err)
}
registry, err := plugins.NewRegistry()
if err != nil {
return fmt.Errorf("failed to create registry: %w", err)
}
installed, err := manager.ListInstalled()
if err != nil {
return fmt.Errorf("failed to list installed plugins: %w", err)
}
pluginList, _ := registry.List()
var errs []error
for _, pluginID := range installed {
plugin := plugins.FindByIDOrName(pluginID, pluginList)
if plugin != nil {
fmt.Printf("Updating plugin: %s (ID: %s)\n", plugin.Name, plugin.ID)
if err := manager.Update(*plugin); err != nil {
if strings.Contains(err.Error(), "cannot update system plugin") {
fmt.Printf("Skipping system plugin: %s\n", plugin.Name)
} else {
errs = append(errs, fmt.Errorf("failed to update %s: %w", plugin.Name, err))
}
} else {
fmt.Printf("Plugin updated successfully: %s\n", plugin.Name)
}
} else {
fmt.Printf("Updating plugin: %s\n", pluginID)
if err := manager.UpdateByIDOrName(pluginID); err != nil {
if strings.Contains(err.Error(), "cannot update system plugin") {
fmt.Printf("Skipping system plugin: %s\n", pluginID)
} else {
errs = append(errs, fmt.Errorf("failed to update %s: %w", pluginID, err))
}
} else {
fmt.Printf("Plugin updated successfully: %s\n", pluginID)
}
}
}
if len(errs) > 0 {
for _, err := range errs {
fmt.Fprintf(os.Stderr, "%v\n", err)
}
return fmt.Errorf("failed to update some plugins")
}
return nil
}
func checkPluginCLI(idOrName string) error {
manager, err := plugins.NewManager()
if err != nil {
return fmt.Errorf("failed to create manager: %w", err)
}
registry, err := plugins.NewRegistry()
if err != nil {
return fmt.Errorf("failed to create registry: %w", err)
}
pluginList, _ := registry.List()
plugin := plugins.FindByIDOrName(idOrName, pluginList)
if plugin != nil {
installed, err := manager.IsInstalled(*plugin)
if err != nil {
return fmt.Errorf("failed to check install status: %w", err)
}
if !installed {
return fmt.Errorf("plugin not installed: %s", plugin.Name)
}
hasUpdates, _, err := manager.HasUpdates(plugin.ID, *plugin)
if err != nil {
return fmt.Errorf("failed to check updates: %w", err)
}
if hasUpdates {
fmt.Printf("Update available for plugin: %s (ID: %s)\n", plugin.Name, plugin.ID)
} else {
fmt.Printf("Plugin is up to date: %s\n", plugin.Name)
}
return nil
}
dummyPlugin := plugins.Plugin{ID: idOrName}
hasUpdates, _, err := manager.HasUpdates(idOrName, dummyPlugin)
if err != nil {
return fmt.Errorf("failed to check updates: %w", err)
}
if hasUpdates {
fmt.Printf("Update available for plugin: %s\n", idOrName)
} else {
fmt.Printf("Plugin is up to date: %s\n", idOrName)
}
return nil
}
func checkAllPluginsCLI() error {
manager, err := plugins.NewManager()
if err != nil {
return fmt.Errorf("failed to create manager: %w", err)
}
registry, err := plugins.NewRegistry()
if err != nil {
return fmt.Errorf("failed to create registry: %w", err)
}
installed, err := manager.ListInstalled()
if err != nil {
return fmt.Errorf("failed to list installed plugins: %w", err)
}
pluginList, _ := registry.List()
var count int
for _, pluginID := range installed {
plugin := plugins.FindByIDOrName(pluginID, pluginList)
var hasUpdates bool
var name string
if plugin != nil {
name = plugin.Name
hasUpdates, _, _ = manager.HasUpdates(pluginID, *plugin)
} else {
name = pluginID
dummyPlugin := plugins.Plugin{ID: pluginID}
hasUpdates, _, _ = manager.HasUpdates(pluginID, dummyPlugin)
}
if hasUpdates {
fmt.Printf("Update available for plugin: %s (ID: %s)\n", name, pluginID)
count++
}
}
if count > 0 {
fmt.Printf("\nFound %d plugin(s) with available updates.\n", count)
} else {
fmt.Println("All plugins are up to date.")
}
return nil
}
func getCommonCommands() []*cobra.Command { func getCommonCommands() []*cobra.Command {
return []*cobra.Command{ return []*cobra.Command{
versionCmd, versionCmd,
-2
View File
@@ -37,11 +37,9 @@ var resolveIncludeCmd = &cobra.Command{
"cursor.lua", "cursor.lua",
"windowrules.lua", "windowrules.lua",
"cursor.kdl", "cursor.kdl",
"layout.kdl",
"outputs.kdl", "outputs.kdl",
"binds.kdl", "binds.kdl",
"cursor.conf", "cursor.conf",
"layout.conf",
"outputs.conf", "outputs.conf",
"binds.conf", "binds.conf",
}, cobra.ShellCompDirectiveNoFileComp }, cobra.ShellCompDirectiveNoFileComp
-3
View File
@@ -557,8 +557,6 @@ func detectRunningWM() string {
return "Hyprland" return "Hyprland"
case os.Getenv("NIRI_SOCKET") != "": case os.Getenv("NIRI_SOCKET") != "":
return "niri" return "niri"
case os.Getenv("MANGO_INSTANCE_SIGNATURE") != "":
return "MangoWC"
case os.Getenv("MIRACLESOCK") != "": case os.Getenv("MIRACLESOCK") != "":
return "Miracle WM" return "Miracle WM"
case os.Getenv("XDG_CURRENT_DESKTOP") != "": case os.Getenv("XDG_CURRENT_DESKTOP") != "":
@@ -886,7 +884,6 @@ func checkOptionalDependencies() []checkResult {
{"cava", "cava", "Audio visualizer", true}, {"cava", "cava", "Audio visualizer", true},
{"khal", "khal", "Calendar events", false}, {"khal", "khal", "Calendar events", false},
{"danksearch", "dsearch", "File search", false}, {"danksearch", "dsearch", "File search", false},
{"dankcalendar", "dcal", "Calendar app", false},
{"fprintd", "fprintd-list", "Fingerprint auth", false}, {"fprintd", "fprintd-list", "Fingerprint auth", false},
} }
+15 -214
View File
@@ -32,14 +32,13 @@ var greeterCmd = &cobra.Command{
var ( var (
greeterConfigSyncFn = greeter.SyncDMSConfigs greeterConfigSyncFn = greeter.SyncDMSConfigs
sharedAuthSyncFn = sharedpam.SyncAuthConfig sharedAuthSyncFn = sharedpam.SyncAuthConfig
greeterIsNixOSFn = greeter.IsNixOS
) )
var greeterInstallCmd = &cobra.Command{ var greeterInstallCmd = &cobra.Command{
Use: "install", Use: "install",
Short: "Install and configure DMS greeter", Short: "Install and configure DMS greeter",
Long: "Install greetd and configure it to use DMS as the greeter interface", Long: "Install greetd and configure it to use DMS as the greeter interface",
PreRunE: preRunGreeterMutation, PreRunE: preRunPrivileged,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
yes, _ := cmd.Flags().GetBool("yes") yes, _ := cmd.Flags().GetBool("yes")
term, _ := cmd.Flags().GetBool("terminal") term, _ := cmd.Flags().GetBool("terminal")
@@ -65,9 +64,6 @@ var greeterSyncCmd = &cobra.Command{
Short: "Sync DMS theme and settings with greeter", Short: "Sync DMS theme and settings with greeter",
Long: "Synchronize your current user's DMS theme, settings, and wallpaper configuration with the login greeter screen. Also updates a per-user cache slot at users/<username>/ for multi-account greeter theme preview.\n\nUse --profile on secondary accounts to sync only your own users/<username>/ slot without sudo or greetd changes.", Long: "Synchronize your current user's DMS theme, settings, and wallpaper configuration with the login greeter screen. Also updates a per-user cache slot at users/<username>/ for multi-account greeter theme preview.\n\nUse --profile on secondary accounts to sync only your own users/<username>/ slot without sudo or greetd changes.",
PreRunE: func(cmd *cobra.Command, args []string) error { PreRunE: func(cmd *cobra.Command, args []string) error {
if err := rejectNixOSGreeterMutation(cmd); err != nil {
return err
}
profile, _ := cmd.Flags().GetBool("profile") profile, _ := cmd.Flags().GetBool("profile")
if profile { if profile {
return nil return nil
@@ -99,35 +95,6 @@ var greeterSyncCmd = &cobra.Command{
}, },
} }
var greeterLaunchSessionCmd = &cobra.Command{
Use: "launch-session",
Short: "Launch a remembered greeter session",
Hidden: true,
Run: func(cmd *cobra.Command, args []string) {
sessionID, _ := cmd.Flags().GetString("session-id")
fromMemory, _ := cmd.Flags().GetBool("from-memory")
cacheDir, _ := cmd.Flags().GetString("cache-dir")
if fromMemory {
homeDir, err := os.UserHomeDir()
if err != nil {
log.Fatalf("failed to get user home directory: %v", err)
}
if err := greeter.LaunchSessionFromMemory(cacheDir, homeDir); err != nil {
log.Fatalf("failed to launch remembered greeter session: %v", err)
}
return
}
if sessionID == "" {
log.Fatal("missing --session-id or --from-memory")
}
if err := greeter.LaunchSessionByID(sessionID); err != nil {
log.Fatalf("failed to launch greeter session %q: %v", sessionID, err)
}
},
}
func init() { func init() {
greeterSyncCmd.Flags().BoolP("yes", "y", false, "Non-interactive mode: skip prompts, use defaults (for UI)") greeterSyncCmd.Flags().BoolP("yes", "y", false, "Non-interactive mode: skip prompts, use defaults (for UI)")
greeterSyncCmd.Flags().BoolP("terminal", "t", false, "Run sync in a new terminal (for entering sudo password); terminal auto-closes when done") greeterSyncCmd.Flags().BoolP("terminal", "t", false, "Run sync in a new terminal (for entering sudo password); terminal auto-closes when done")
@@ -135,16 +102,13 @@ func init() {
greeterSyncCmd.Flags().BoolP("local", "l", false, "Developer mode: force greetd config to use a local DMS checkout path") greeterSyncCmd.Flags().BoolP("local", "l", false, "Developer mode: force greetd config to use a local DMS checkout path")
greeterSyncCmd.Flags().BoolP("profile", "p", false, "Sync only your per-user greeter slot (no sudo; for secondary accounts)") greeterSyncCmd.Flags().BoolP("profile", "p", false, "Sync only your per-user greeter slot (no sudo; for secondary accounts)")
greeterSyncCmd.Flags().Bool("autologin", false, "Apply only greeter auto-login on startup settings to greetd (no theme or auth sync)") greeterSyncCmd.Flags().Bool("autologin", false, "Apply only greeter auto-login on startup settings to greetd (no theme or auth sync)")
greeterLaunchSessionCmd.Flags().String("session-id", "", "Desktop session id to launch")
greeterLaunchSessionCmd.Flags().Bool("from-memory", false, "Resolve the session id from greeter memory")
greeterLaunchSessionCmd.Flags().String("cache-dir", greeter.GreeterCacheDir, "Greeter cache directory")
} }
var greeterEnableCmd = &cobra.Command{ var greeterEnableCmd = &cobra.Command{
Use: "enable", Use: "enable",
Short: "Enable DMS greeter in greetd config", Short: "Enable DMS greeter in greetd config",
Long: "Configure greetd to use DMS as the greeter", Long: "Configure greetd to use DMS as the greeter",
PreRunE: preRunGreeterMutation, PreRunE: preRunPrivileged,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
yes, _ := cmd.Flags().GetBool("yes") yes, _ := cmd.Flags().GetBool("yes")
term, _ := cmd.Flags().GetBool("terminal") term, _ := cmd.Flags().GetBool("terminal")
@@ -180,7 +144,7 @@ var greeterUninstallCmd = &cobra.Command{
Use: "uninstall", Use: "uninstall",
Short: "Remove DMS greeter configuration and restore previous display manager", Short: "Remove DMS greeter configuration and restore previous display manager",
Long: "Disable greetd, remove DMS managed configs, and restore the system to its pre-DMS-greeter state", Long: "Disable greetd, remove DMS managed configs, and restore the system to its pre-DMS-greeter state",
PreRunE: preRunGreeterMutation, PreRunE: preRunPrivileged,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
yes, _ := cmd.Flags().GetBool("yes") yes, _ := cmd.Flags().GetBool("yes")
term, _ := cmd.Flags().GetBool("terminal") term, _ := cmd.Flags().GetBool("terminal")
@@ -210,21 +174,6 @@ func init() {
greeterUninstallCmd.Flags().BoolP("terminal", "t", false, "Run in a new terminal (for entering sudo password)") greeterUninstallCmd.Flags().BoolP("terminal", "t", false, "Run in a new terminal (for entering sudo password)")
} }
func rejectNixOSGreeterMutation(cmd *cobra.Command) error {
if !greeterIsNixOSFn() {
return nil
}
return fmt.Errorf("dms %s is disabled on NixOS because the greeter is managed declaratively\nConfigure the DMS greeter in your NixOS module, then apply the change with your normal nixos-rebuild workflow", normalizeCommandSpec(cmd.CommandPath()))
}
func preRunGreeterMutation(cmd *cobra.Command, args []string) error {
if err := rejectNixOSGreeterMutation(cmd); err != nil {
return err
}
return preRunPrivileged(cmd, args)
}
func syncGreeterConfigsAndAuth(dmsPath, compositor string, logFunc func(string), options sharedpam.SyncAuthOptions, beforeAuth func()) error { func syncGreeterConfigsAndAuth(dmsPath, compositor string, logFunc func(string), options sharedpam.SyncAuthOptions, beforeAuth func()) error {
if err := greeterConfigSyncFn(dmsPath, compositor, logFunc, ""); err != nil { if err := greeterConfigSyncFn(dmsPath, compositor, logFunc, ""); err != nil {
return err return err
@@ -350,7 +299,7 @@ func installGreeter(nonInteractive bool) error {
fmt.Println("\n=== Installation Complete ===") fmt.Println("\n=== Installation Complete ===")
fmt.Println("\nTo start the greeter now, run:") fmt.Println("\nTo start the greeter now, run:")
fmt.Println(startGreeterHint()) fmt.Println(" sudo systemctl start greetd")
fmt.Println("\nOr reboot to see the greeter at next boot.") fmt.Println("\nOr reboot to see the greeter at next boot.")
return nil return nil
@@ -377,13 +326,7 @@ func uninstallGreeter(nonInteractive bool) error {
} }
fmt.Println("\nDisabling greetd...") fmt.Println("\nDisabling greetd...")
if isRunit() { if err := privesc.Run(context.Background(), "", "systemctl", "disable", "greetd"); err != nil {
if err := disableRunitService("greetd"); err != nil {
fmt.Printf(" ⚠ Could not disable greetd: %v\n", err)
} else {
fmt.Println(" ✓ greetd disabled")
}
} else if err := privesc.Run(context.Background(), "", "systemctl", "disable", "greetd"); err != nil {
fmt.Printf(" ⚠ Could not disable greetd: %v\n", err) fmt.Printf(" ⚠ Could not disable greetd: %v\n", err)
} else { } else {
fmt.Println(" ✓ greetd disabled") fmt.Println(" ✓ greetd disabled")
@@ -506,14 +449,6 @@ func suggestDisplayManagerRestore(nonInteractive bool) {
enableDM := func(dm string) { enableDM := func(dm string) {
fmt.Printf(" Enabling %s...\n", dm) fmt.Printf(" Enabling %s...\n", dm)
if isRunit() {
if err := enableRunitService(dm); err != nil {
fmt.Printf(" ⚠ Failed to enable %s: %v\n", dm, err)
} else {
fmt.Printf(" ✓ %s enabled (linked into %s).\n", dm, runitServiceDir)
}
return
}
if err := privesc.Run(context.Background(), "", "systemctl", "enable", "--force", dm); err != nil { if err := privesc.Run(context.Background(), "", "systemctl", "enable", "--force", dm); err != nil {
fmt.Printf(" ⚠ Failed to enable %s: %v\n", dm, err) fmt.Printf(" ⚠ Failed to enable %s: %v\n", dm, err)
} else { } else {
@@ -560,9 +495,6 @@ func suggestDisplayManagerRestore(nonInteractive bool) {
} }
func isSystemdUnitInstalled(unit string) bool { func isSystemdUnitInstalled(unit string) bool {
if isRunit() {
return runitServiceInstalled(unit)
}
cmd := exec.Command("systemctl", "list-unit-files", unit+".service", "--no-legend", "--no-pager") cmd := exec.Command("systemctl", "list-unit-files", unit+".service", "--no-legend", "--no-pager")
out, err := cmd.Output() out, err := cmd.Output()
return err == nil && strings.Contains(string(out), unit) return err == nil && strings.Contains(string(out), unit)
@@ -1011,18 +943,6 @@ func resolveLocalDMSPath() (string, error) {
} }
func disableDisplayManager(dmName string) (bool, error) { func disableDisplayManager(dmName string) (bool, error) {
if isRunit() {
if !runitServiceEnabled(dmName) {
return false, nil
}
fmt.Printf("\nDisabling %s (runit)...\n", dmName)
if err := disableRunitService(dmName); err != nil {
return false, fmt.Errorf("failed to disable %s: %w", dmName, err)
}
fmt.Printf(" ✓ %s disabled (removed from %s)\n", dmName, runitServiceDir)
return true, nil
}
state, err := getSystemdServiceState(dmName) state, err := getSystemdServiceState(dmName)
if err != nil { if err != nil {
return false, fmt.Errorf("failed to check %s state: %w", dmName, err) return false, fmt.Errorf("failed to check %s state: %w", dmName, err)
@@ -1076,21 +996,6 @@ func disableDisplayManager(dmName string) (bool, error) {
} }
func ensureGreetdEnabled() error { func ensureGreetdEnabled() error {
if isRunit() {
fmt.Println("\nEnabling greetd service (runit)...")
if !runitServiceInstalled("greetd") {
return fmt.Errorf("greetd service not found in %s. Please install greetd first", runitSvDir)
}
// Seat + runtime-dir setup that logind handles automatically on systemd.
ensureRunitSeat("_greeter")
ensureGreetdPamRundir()
if err := enableRunitService("greetd"); err != nil {
return fmt.Errorf("failed to enable greetd: %w", err)
}
fmt.Printf(" ✓ greetd enabled (%s)\n", runitServiceDir)
return nil
}
fmt.Println("\nChecking greetd service status...") fmt.Println("\nChecking greetd service status...")
state, err := getSystemdServiceState("greetd") state, err := getSystemdServiceState("greetd")
@@ -1138,12 +1043,6 @@ func ensureGreetdEnabled() error {
} }
func ensureGraphicalTarget() error { func ensureGraphicalTarget() error {
if isRunit() {
// runit has no targets; a supervised greetd service is the graphical
// login, so there is nothing to set here.
return nil
}
getDefaultCmd := exec.Command("systemctl", "get-default") getDefaultCmd := exec.Command("systemctl", "get-default")
currentTarget, err := getDefaultCmd.Output() currentTarget, err := getDefaultCmd.Output()
if err != nil { if err != nil {
@@ -1277,7 +1176,7 @@ func enableGreeter(nonInteractive bool) error {
fmt.Println("\n=== Enable Complete ===") fmt.Println("\n=== Enable Complete ===")
fmt.Println("\nGreeter configuration verified and system state corrected.") fmt.Println("\nGreeter configuration verified and system state corrected.")
fmt.Println("To start the greeter now, run:") fmt.Println("To start the greeter now, run:")
fmt.Println(startGreeterHint()) fmt.Println(" sudo systemctl start greetd")
fmt.Println("\nOr reboot to see the greeter at boot time.") fmt.Println("\nOr reboot to see the greeter at boot time.")
return nil return nil
@@ -1358,7 +1257,7 @@ func enableGreeter(nonInteractive bool) error {
fmt.Println("\n=== Enable Complete ===") fmt.Println("\n=== Enable Complete ===")
fmt.Println("\nTo start the greeter now, run:") fmt.Println("\nTo start the greeter now, run:")
fmt.Println(startGreeterHint()) fmt.Println(" sudo systemctl start greetd")
fmt.Println("\nOr reboot to see the greeter at boot time.") fmt.Println("\nOr reboot to see the greeter at boot time.")
return nil return nil
@@ -1434,36 +1333,24 @@ func readDefaultSessionCommand(configPath string) string {
return "" return ""
} }
func explicitGreeterCacheDirFromCommand(command string) (string, bool) { func extractGreeterCacheDirFromCommand(command string) string {
if command == "" {
return greeter.GreeterCacheDir
}
tokens := strings.Fields(command) tokens := strings.Fields(command)
for i := 0; i < len(tokens); i++ { for i := 0; i < len(tokens); i++ {
token := strings.Trim(tokens[i], "\"") token := strings.Trim(tokens[i], "\"")
if token == "--cache-dir" && i+1 < len(tokens) { if token == "--cache-dir" && i+1 < len(tokens) {
value := strings.Trim(tokens[i+1], "\"") return strings.Trim(tokens[i+1], "\"")
if value != "" {
return value, true
}
} }
if strings.HasPrefix(token, "--cache-dir=") { if strings.HasPrefix(token, "--cache-dir=") {
value := strings.TrimPrefix(token, "--cache-dir=") value := strings.TrimPrefix(token, "--cache-dir=")
value = strings.Trim(value, "\"") value = strings.Trim(value, "\"")
if value != "" { if value != "" {
return value, true return value
} }
} }
} }
return "", false
}
const nixOSGreeterStateDir = "/var/lib/dms-greeter"
func greeterStatusStateDir(command string, isNixOS bool) string {
if cacheDir, ok := explicitGreeterCacheDirFromCommand(command); ok {
return cacheDir
}
if isNixOS {
return nixOSGreeterStateDir
}
return greeter.GreeterCacheDir return greeter.GreeterCacheDir
} }
@@ -1534,8 +1421,6 @@ func packageInstallHint() string {
return "Install with 'sudo dnf install dms-greeter' (requires COPR: sudo dnf copr enable avengemedia/danklinux)" return "Install with 'sudo dnf install dms-greeter' (requires COPR: sudo dnf copr enable avengemedia/danklinux)"
case distros.FamilyArch: case distros.FamilyArch:
return "Install from AUR with 'paru -S greetd-dms-greeter-git' or 'yay -S greetd-dms-greeter-git'" return "Install from AUR with 'paru -S greetd-dms-greeter-git' or 'yay -S greetd-dms-greeter-git'"
case distros.FamilyVoid:
return "Install with 'sudo xbps-install -S dms-greeter' (requires DMS XBPS repo: echo 'repository=https://avengemedia.github.io/DankMaterialShell/current' | sudo tee /etc/xbps.d/dms.conf)"
default: default:
return "Run 'dms greeter install' to install greeter" return "Run 'dms greeter install' to install greeter"
} }
@@ -1574,8 +1459,7 @@ func isPackageOnlyGreeterDistro() bool {
config.Family == distros.FamilySUSE || config.Family == distros.FamilySUSE ||
config.Family == distros.FamilyUbuntu || config.Family == distros.FamilyUbuntu ||
config.Family == distros.FamilyFedora || config.Family == distros.FamilyFedora ||
config.Family == distros.FamilyArch || config.Family == distros.FamilyArch
config.Family == distros.FamilyVoid
} }
func promptCompositorChoice(compositors []string) (string, error) { func promptCompositorChoice(compositors []string) (string, error) {
@@ -1603,10 +1487,6 @@ func checkGreeterStatus() error {
fmt.Println("=== DMS Greeter Status ===") fmt.Println("=== DMS Greeter Status ===")
fmt.Println() fmt.Println()
if greeterIsNixOSFn() {
return checkNixOSGreeterStatus()
}
homeDir, err := os.UserHomeDir() homeDir, err := os.UserHomeDir()
if err != nil { if err != nil {
return fmt.Errorf("failed to get user home directory: %w", err) return fmt.Errorf("failed to get user home directory: %w", err)
@@ -1670,7 +1550,7 @@ func checkGreeterStatus() error {
fmt.Println(" Run 'dms greeter sync' to set up group membership and permissions") fmt.Println(" Run 'dms greeter sync' to set up group membership and permissions")
} }
cacheDir := greeterStatusStateDir(configuredCommand, false) cacheDir := extractGreeterCacheDirFromCommand(configuredCommand)
fmt.Println("\nGreeter Cache Directory:") fmt.Println("\nGreeter Cache Directory:")
fmt.Printf(" Effective cache dir: %s\n", cacheDir) fmt.Printf(" Effective cache dir: %s\n", cacheDir)
if cacheDir != greeter.GreeterCacheDir { if cacheDir != greeter.GreeterCacheDir {
@@ -1933,85 +1813,6 @@ func checkGreeterStatus() error {
return nil return nil
} }
func checkNixOSGreeterStatus() error {
const configPath = "/etc/greetd/config.toml"
configuredCommand := readDefaultSessionCommand(configPath)
allGood := true
fmt.Println("Greeter Configuration:")
switch {
case strings.Contains(configuredCommand, "dms-greeter"):
fmt.Println(" ✓ DMS greeter command found")
if wrapper := extractGreeterWrapperFromCommand(configuredCommand); wrapper != "" {
fmt.Printf(" Wrapper: %s\n", wrapper)
}
case configuredCommand != "":
fmt.Println(" ⚠ greetd default session does not reference dms-greeter")
allGood = false
default:
fmt.Printf(" No readable DMS command found in %s\n", configPath)
}
fmt.Println(" NixOS manages greeter configuration declaratively; apply changes through your NixOS module.")
stateDir := greeterStatusStateDir(configuredCommand, true)
fmt.Println("\nGreeter State Directory:")
fmt.Printf(" Effective state dir: %s\n", stateDir)
if stateDir == nixOSGreeterStateDir {
fmt.Println(" ✓ Using the NixOS module state path")
}
if stat, err := os.Stat(stateDir); err == nil && stat.IsDir() {
fmt.Printf(" ✓ %s exists\n", stateDir)
} else if os.IsNotExist(err) {
fmt.Printf(" ✗ %s not found\n", stateDir)
fmt.Println(" Rebuild your NixOS configuration after enabling the DMS greeter module.")
allGood = false
} else if err != nil {
fmt.Printf(" ✗ Could not inspect %s: %v\n", stateDir, err)
allGood = false
} else {
fmt.Printf(" ✗ %s is not a directory\n", stateDir)
allGood = false
}
fmt.Println("\nDeclarative Configuration Files:")
configFiles := []struct {
name string
path string
}{
{name: "Settings", path: filepath.Join(stateDir, "settings.json")},
{name: "Session state", path: filepath.Join(stateDir, "session.json")},
{name: "Color theme", path: filepath.Join(stateDir, "colors.json")},
}
for _, configFile := range configFiles {
if stat, err := os.Stat(configFile.path); err == nil && !stat.IsDir() {
fmt.Printf(" ✓ %s: %s\n", configFile.name, configFile.path)
} else if os.IsNotExist(err) {
fmt.Printf(" %s not present (optional; configure configHome/configFiles in the NixOS module)\n", configFile.name)
} else if err != nil {
fmt.Printf(" ⚠ %s could not be inspected: %v\n", configFile.name, err)
} else {
fmt.Printf(" ⚠ %s path is not a regular file: %s\n", configFile.name, configFile.path)
}
}
fmt.Println("\nGroup Membership:")
fmt.Println(" User group membership is managed by NixOS and is not required for declarative theme copies.")
fmt.Println("\nGreeter PAM Authentication:")
fmt.Println(" PAM is managed by NixOS modules.")
fmt.Println(" Configure fingerprint/U2F through security.pam.services.greetd.")
fmt.Println()
if allGood {
fmt.Println("✓ NixOS greeter state looks healthy and is managed declaratively.")
} else {
fmt.Println("⚠ Some issues detected. Update the DMS greeter module and rebuild NixOS; do not run 'dms greeter sync'.")
}
return nil
}
func recentAppArmorGreeterDenials(sampleLimit int) (int, []string, error) { func recentAppArmorGreeterDenials(sampleLimit int) (int, []string, error) {
if sampleLimit <= 0 { if sampleLimit <= 0 {
sampleLimit = 3 sampleLimit = 3
-56
View File
@@ -3,11 +3,9 @@ package main
import ( import (
"errors" "errors"
"reflect" "reflect"
"strings"
"testing" "testing"
sharedpam "github.com/AvengeMedia/DankMaterialShell/core/internal/pam" sharedpam "github.com/AvengeMedia/DankMaterialShell/core/internal/pam"
"github.com/spf13/cobra"
) )
func TestSyncGreeterConfigsAndAuthDelegatesSharedAuth(t *testing.T) { func TestSyncGreeterConfigsAndAuthDelegatesSharedAuth(t *testing.T) {
@@ -87,57 +85,3 @@ func TestSyncGreeterConfigsAndAuthStopsOnConfigError(t *testing.T) {
t.Fatal("expected auth sync not to run after config sync failure") t.Fatal("expected auth sync not to run after config sync failure")
} }
} }
func TestGreeterStatusStateDirUsesNixOSDefault(t *testing.T) {
if got := greeterStatusStateDir("", true); got != nixOSGreeterStateDir {
t.Fatalf("greeterStatusStateDir() = %q, want %q", got, nixOSGreeterStateDir)
}
}
func TestGreeterStatusStateDirHonorsExplicitOverrideOnNixOS(t *testing.T) {
command := "dms-greeter --cache-dir /srv/dms-greeter --command niri"
if got := greeterStatusStateDir(command, true); got != "/srv/dms-greeter" {
t.Fatalf("greeterStatusStateDir() = %q, want %q", got, "/srv/dms-greeter")
}
}
func TestRejectNixOSGreeterMutationBlocksImperativeCommands(t *testing.T) {
origGreeterIsNixOSFn := greeterIsNixOSFn
greeterIsNixOSFn = func() bool { return true }
t.Cleanup(func() {
greeterIsNixOSFn = origGreeterIsNixOSFn
})
for _, commandName := range []string{"install", "enable", "sync", "uninstall"} {
t.Run(commandName, func(t *testing.T) {
root := &cobra.Command{Use: "dms"}
greeterCommand := &cobra.Command{Use: "greeter"}
mutationCommand := &cobra.Command{Use: commandName}
root.AddCommand(greeterCommand)
greeterCommand.AddCommand(mutationCommand)
err := rejectNixOSGreeterMutation(mutationCommand)
if err == nil {
t.Fatalf("expected NixOS greeter %s to be rejected", commandName)
}
if !strings.Contains(err.Error(), "dms greeter "+commandName+" is disabled on NixOS") {
t.Fatalf("unexpected error: %v", err)
}
if strings.Contains(err.Error(), "/var/cache/dms-greeter") {
t.Fatalf("NixOS remediation should not recommend the non-NixOS cache path: %v", err)
}
})
}
}
func TestRejectNixOSGreeterMutationAllowsOtherDistros(t *testing.T) {
origGreeterIsNixOSFn := greeterIsNixOSFn
greeterIsNixOSFn = func() bool { return false }
t.Cleanup(func() {
greeterIsNixOSFn = origGreeterIsNixOSFn
})
if err := rejectNixOSGreeterMutation(&cobra.Command{Use: "sync"}); err != nil {
t.Fatalf("expected non-NixOS greeter command to be allowed, got %v", err)
}
}
-23
View File
@@ -38,17 +38,10 @@ var matugenCheckCmd = &cobra.Command{
Run: runMatugenCheck, Run: runMatugenCheck,
} }
var matugenPreviewCmd = &cobra.Command{
Use: "preview",
Short: "Preview Matugen scheme colors without applying them",
Run: runMatugenPreview,
}
func init() { func init() {
matugenCmd.AddCommand(matugenGenerateCmd) matugenCmd.AddCommand(matugenGenerateCmd)
matugenCmd.AddCommand(matugenQueueCmd) matugenCmd.AddCommand(matugenQueueCmd)
matugenCmd.AddCommand(matugenCheckCmd) matugenCmd.AddCommand(matugenCheckCmd)
matugenCmd.AddCommand(matugenPreviewCmd)
for _, cmd := range []*cobra.Command{matugenGenerateCmd, matugenQueueCmd} { for _, cmd := range []*cobra.Command{matugenGenerateCmd, matugenQueueCmd} {
cmd.Flags().String("state-dir", "", "State directory for cache files") cmd.Flags().String("state-dir", "", "State directory for cache files")
@@ -69,8 +62,6 @@ func init() {
matugenQueueCmd.Flags().Bool("wait", true, "Wait for completion") matugenQueueCmd.Flags().Bool("wait", true, "Wait for completion")
matugenQueueCmd.Flags().Duration("timeout", 90*time.Second, "Timeout for waiting") matugenQueueCmd.Flags().Duration("timeout", 90*time.Second, "Timeout for waiting")
matugenPreviewCmd.Flags().String("source-color", "", "Source color used to generate previews")
matugenPreviewCmd.Flags().Float64("contrast", 0, "Contrast value from -1 to 1 (0 = standard)")
} }
func buildMatugenOptions(cmd *cobra.Command) matugen.Options { func buildMatugenOptions(cmd *cobra.Command) matugen.Options {
@@ -209,17 +200,3 @@ func runMatugenCheck(cmd *cobra.Command, args []string) {
} }
fmt.Println(string(data)) fmt.Println(string(data))
} }
func runMatugenPreview(cmd *cobra.Command, args []string) {
sourceColor, _ := cmd.Flags().GetString("source-color")
contrast, _ := cmd.Flags().GetFloat64("contrast")
previews, err := matugen.PreviewSchemes(sourceColor, contrast)
if err != nil {
log.Fatalf("Failed to generate Matugen previews: %v", err)
}
data, err := json.Marshal(previews)
if err != nil {
log.Fatalf("Failed to marshal Matugen previews: %v", err)
}
fmt.Println(string(data))
}
-13
View File
@@ -10,7 +10,6 @@ import (
"github.com/AvengeMedia/DankMaterialShell/core/internal/config" "github.com/AvengeMedia/DankMaterialShell/core/internal/config"
"github.com/AvengeMedia/DankMaterialShell/core/internal/deps" "github.com/AvengeMedia/DankMaterialShell/core/internal/deps"
"github.com/AvengeMedia/DankMaterialShell/core/internal/distros"
"github.com/AvengeMedia/DankMaterialShell/core/internal/greeter" "github.com/AvengeMedia/DankMaterialShell/core/internal/greeter"
"github.com/AvengeMedia/DankMaterialShell/core/internal/log" "github.com/AvengeMedia/DankMaterialShell/core/internal/log"
"github.com/AvengeMedia/DankMaterialShell/core/internal/privesc" "github.com/AvengeMedia/DankMaterialShell/core/internal/privesc"
@@ -299,9 +298,6 @@ func runSetup() error {
if wmSelected { if wmSelected {
if wm == deps.WindowManagerMango { if wm == deps.WindowManagerMango {
useSystemd = false useSystemd = false
} else if isVoidSetup() {
useSystemd = false
fmt.Println("\nVoid Linux detected; deploying non-systemd session config.")
} else { } else {
useSystemd = promptSystemd() useSystemd = promptSystemd()
} }
@@ -376,15 +372,6 @@ func runSetup() error {
return nil return nil
} }
func isVoidSetup() bool {
osInfo, err := distros.GetOSInfo()
if err != nil {
return false
}
config, exists := distros.Registry[osInfo.Distribution.ID]
return exists && config.Family == distros.FamilyVoid
}
// Add user to the input group for the evdev manager for inut state tracking. // Add user to the input group for the evdev manager for inut state tracking.
// Caps Lock OSD and the Caps Lock bar indicator. // Caps Lock OSD and the Caps Lock bar indicator.
func ensureInputGroup() { func ensureInputGroup() {
-24
View File
@@ -1,24 +0,0 @@
package main
import (
"encoding/json"
"testing"
)
func TestDefaultImmutablePolicyAllowsSyncButBlocksEnable(t *testing.T) {
var policyFile cliPolicyFile
if err := json.Unmarshal(defaultCLIPolicyJSON, &policyFile); err != nil {
t.Fatalf("failed to parse embedded CLI policy: %v", err)
}
if policyFile.BlockedCommands == nil {
t.Fatal("embedded CLI policy has no blocked_commands")
}
blocked := normalizeBlockedCommands(*policyFile.BlockedCommands)
if !commandBlockedByPolicy("greeter enable", blocked) {
t.Fatal("expected greeter enable to remain blocked on immutable/image-based systems")
}
if commandBlockedByPolicy("greeter sync", blocked) {
t.Fatal("expected greeter sync to remain available on immutable/image-based systems")
}
}
-114
View File
@@ -1,114 +0,0 @@
package main
import (
"context"
"fmt"
"os"
"strings"
"github.com/AvengeMedia/DankMaterialShell/core/internal/privesc"
)
// runit (Void Linux) service helpers. Services live in /etc/sv and are "enabled"
// by symlinking them into the /var/service supervision dir, so the greeter
// commands branch on isRunit() instead of shelling systemctl.
const (
runitSvDir = "/etc/sv"
runitServiceDir = "/var/service"
)
// isRunit reports whether this system is supervised by runit (Void Linux).
func isRunit() bool {
if fi, err := os.Stat("/run/runit"); err == nil && fi.IsDir() {
return true
}
if _, err := os.Stat("/run/systemd/system"); err == nil {
return false
}
if fi, err := os.Stat(runitServiceDir); err == nil && fi.IsDir() {
return true
}
return false
}
func runitServiceInstalled(name string) bool {
fi, err := os.Stat(runitSvDir + "/" + name)
return err == nil && fi.IsDir()
}
func runitServiceEnabled(name string) bool {
_, err := os.Lstat(runitServiceDir + "/" + name)
return err == nil
}
// enableRunitService links a service into /var/service (idempotent).
func enableRunitService(name string) error {
if !runitServiceInstalled(name) {
return fmt.Errorf("runit service %q not found in %s", name, runitSvDir)
}
if runitServiceEnabled(name) {
return nil
}
return privesc.Run(context.Background(), "", "ln", "-sf",
runitSvDir+"/"+name, runitServiceDir+"/"+name)
}
// disableRunitService removes a service's supervision symlink.
func disableRunitService(name string) error {
if !runitServiceEnabled(name) {
return nil
}
return privesc.Run(context.Background(), "", "rm", "-f",
runitServiceDir+"/"+name)
}
// ensureRunitSeat sets up the seat access a Wayland greeter needs on runit (the
// equivalent of logind on systemd): enables seatd and adds the greeter user to
// the seat/video/input groups. Failures are reported but non-fatal.
func ensureRunitSeat(greeterUser string) {
if runitServiceInstalled("seatd") {
if err := enableRunitService("seatd"); err != nil {
fmt.Printf(" ⚠ could not enable seatd: %v\n", err)
} else {
fmt.Println(" ✓ seatd enabled")
}
} else {
fmt.Println(" ⚠ seatd not installed — the greeter compositor needs it for GPU/seat access")
}
if err := privesc.Run(context.Background(), "", "usermod", "-aG", "_seatd,video,input", greeterUser); err != nil {
fmt.Printf(" ⚠ could not add %s to seat groups: %v\n", greeterUser, err)
} else {
fmt.Printf(" ✓ %s added to seat groups (_seatd, video, input)\n", greeterUser)
}
}
// ensureGreetdPamRundir adds pam_rundir to the greetd PAM stack so the post-login
// session gets an XDG_RUNTIME_DIR on systems without logind (Void with seatd).
// Appended outside DMS's managed auth block so it survives `dms greeter sync`.
func ensureGreetdPamRundir() {
const pamPath = "/etc/pam.d/greetd"
data, err := os.ReadFile(pamPath)
if err != nil {
fmt.Printf(" ⚠ could not read %s: %v\n", pamPath, err)
return
}
if strings.Contains(string(data), "pam_rundir") {
return
}
line := "session optional pam_rundir.so"
if err := privesc.Run(context.Background(), "", "sh", "-c",
fmt.Sprintf("printf '%%s\\n' %q >> %s", line, pamPath)); err != nil {
fmt.Printf(" ⚠ could not add pam_rundir to %s: %v\n", pamPath, err)
return
}
fmt.Println(" ✓ pam_rundir added to greetd PAM (provides XDG_RUNTIME_DIR for the session)")
}
// startGreeterHint returns the init-appropriate "start greetd now" command.
func startGreeterHint() string {
if isRunit() {
return " sudo sv up greetd"
}
return " sudo systemctl start greetd"
}
+1 -1
View File
@@ -19,7 +19,7 @@ func init() {
runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)") runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)")
runCmd.Flags().MarkHidden("daemon-child") runCmd.Flags().MarkHidden("daemon-child")
greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd, greeterLaunchSessionCmd) greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd)
authCmd.AddCommand(authSyncCmd) authCmd.AddCommand(authSyncCmd)
setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd) setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd)
updateCmd.AddCommand(updateCheckCmd) updateCmd.AddCommand(updateCheckCmd)
+1 -1
View File
@@ -19,7 +19,7 @@ func init() {
runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)") runCmd.Flags().String("log-file", "", "Append logs to this file in addition to stderr (overrides DMS_LOG_FILE)")
runCmd.Flags().MarkHidden("daemon-child") runCmd.Flags().MarkHidden("daemon-child")
greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd, greeterLaunchSessionCmd) greeterCmd.AddCommand(greeterInstallCmd, greeterSyncCmd, greeterEnableCmd, greeterStatusCmd, greeterUninstallCmd)
authCmd.AddCommand(authSyncCmd) authCmd.AddCommand(authSyncCmd)
setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd) setupCmd.AddCommand(setupBindsCmd, setupLayoutCmd, setupColorsCmd, setupAlttabCmd, setupOutputsCmd, setupCursorCmd, setupWindowrulesCmd)
pluginsCmd.AddCommand(pluginsBrowseCmd, pluginsListCmd, pluginsInstallCmd, pluginsUninstallCmd, pluginsUpdateCmd) pluginsCmd.AddCommand(pluginsBrowseCmd, pluginsListCmd, pluginsInstallCmd, pluginsUninstallCmd, pluginsUpdateCmd)
-7
View File
@@ -101,13 +101,6 @@ func getServerSocketPath() string {
runtimeDir = os.TempDir() runtimeDir = os.TempDir()
} }
if parentPID, ok := sessionParentPID(os.Getenv("WAYLAND_DISPLAY")); ok {
sessionSock := filepath.Join(runtimeDir, fmt.Sprintf("danklinux-%d.sock", parentPID))
if _, err := os.Stat(sessionSock); err == nil {
return sessionSock
}
}
entries, err := os.ReadDir(runtimeDir) entries, err := os.ReadDir(runtimeDir)
if err != nil { if err != nil {
return filepath.Join(runtimeDir, "danklinux.sock") return filepath.Join(runtimeDir, "danklinux.sock")
+34 -133
View File
@@ -101,23 +101,14 @@ func getPIDFilePath() string {
return filepath.Join(getRuntimeDir(), fmt.Sprintf("danklinux-%d.pid", os.Getpid())) return filepath.Join(getRuntimeDir(), fmt.Sprintf("danklinux-%d.pid", os.Getpid()))
} }
func getSessionFilePath() string {
return filepath.Join(getRuntimeDir(), fmt.Sprintf("danklinux-%d.session", os.Getpid()))
}
func writePIDFile(childPID int) error { func writePIDFile(childPID int) error {
pidFile := getPIDFilePath() pidFile := getPIDFilePath()
if display := os.Getenv("WAYLAND_DISPLAY"); display != "" {
if err := os.WriteFile(getSessionFilePath(), []byte(display), 0o644); err != nil {
log.Warnf("Failed to write session file: %v", err)
}
}
return os.WriteFile(pidFile, []byte(strconv.Itoa(childPID)), 0o644) return os.WriteFile(pidFile, []byte(strconv.Itoa(childPID)), 0o644)
} }
func removePIDFile() { func removePIDFile() {
os.Remove(getPIDFilePath()) pidFile := getPIDFilePath()
os.Remove(getSessionFilePath()) os.Remove(pidFile)
} }
func getAllDMSPIDs() []int { func getAllDMSPIDs() []int {
@@ -234,9 +225,6 @@ func runShellInteractive(session bool) {
if os.Getenv("QT_QPA_PLATFORM") == "" { if os.Getenv("QT_QPA_PLATFORM") == "" {
cmd.Env = append(cmd.Env, "QT_QPA_PLATFORM=wayland;xcb") cmd.Env = append(cmd.Env, "QT_QPA_PLATFORM=wayland;xcb")
} }
if os.Getenv("QSG_USE_SIMPLE_ANIMATION_DRIVER") == "" {
cmd.Env = append(cmd.Env, "QSG_USE_SIMPLE_ANIMATION_DRIVER=1")
}
cmd.Env = appendLogEnv(cmd.Env) cmd.Env = appendLogEnv(cmd.Env)
@@ -399,11 +387,9 @@ func killShell() {
} }
for _, entry := range entries { for _, entry := range entries {
if !strings.HasPrefix(entry.Name(), "danklinux-") { if strings.HasPrefix(entry.Name(), "danklinux-") && strings.HasSuffix(entry.Name(), ".pid") {
continue pidFile := filepath.Join(dir, entry.Name())
} os.Remove(pidFile)
if strings.HasSuffix(entry.Name(), ".pid") || strings.HasSuffix(entry.Name(), ".session") {
os.Remove(filepath.Join(dir, entry.Name()))
} }
} }
} }
@@ -491,9 +477,6 @@ func runShellDaemon(session bool) {
if os.Getenv("QT_QPA_PLATFORM") == "" { if os.Getenv("QT_QPA_PLATFORM") == "" {
cmd.Env = append(cmd.Env, "QT_QPA_PLATFORM=wayland;xcb") cmd.Env = append(cmd.Env, "QT_QPA_PLATFORM=wayland;xcb")
} }
if os.Getenv("QSG_USE_SIMPLE_ANIMATION_DRIVER") == "" {
cmd.Env = append(cmd.Env, "QSG_USE_SIMPLE_ANIMATION_DRIVER=1")
}
cmd.Env = appendLogEnv(cmd.Env) cmd.Env = appendLogEnv(cmd.Env)
@@ -582,11 +565,7 @@ func runShellDaemon(session bool) {
} }
var qsHasAnyDisplay = sync.OnceValue(func() bool { var qsHasAnyDisplay = sync.OnceValue(func() bool {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) out, err := exec.Command("qs", "ipc", "--help").Output()
defer cancel()
cmd := exec.CommandContext(ctx, "qs", "ipc", "--help")
cmd.WaitDelay = 500 * time.Millisecond
out, err := cmd.Output()
if err != nil { if err != nil {
return false return false
} }
@@ -622,34 +601,13 @@ func parseTargetsFromIPCShowOutput(output string) ipcTargets {
return targets return targets
} }
func buildQsIPCBaseArgs() ([]string, error) {
cmdArgs := []string{"ipc"}
switch pid, ok := getSessionDMSPID(); {
case ok:
cmdArgs = append(cmdArgs, "--pid", strconv.Itoa(pid))
default:
if err := findConfig(nil, nil); err != nil {
return nil, err
}
if qsHasAnyDisplay() {
cmdArgs = append(cmdArgs, "--any-display")
}
cmdArgs = append(cmdArgs, "-p", configPath)
}
return cmdArgs, nil
}
func getShellIPCCompletions(args []string, _ string) []string { func getShellIPCCompletions(args []string, _ string) []string {
baseArgs, err := buildQsIPCBaseArgs() cmdArgs := []string{"ipc"}
if err != nil { if qsHasAnyDisplay() {
log.Debugf("Error building IPC args for completions: %v", err) cmdArgs = append(cmdArgs, "--any-display")
return nil
} }
cmdArgs := append(baseArgs, "show") cmdArgs = append(cmdArgs, "-p", configPath, "show")
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) cmd := exec.Command("qs", cmdArgs...)
defer cancel()
cmd := exec.CommandContext(ctx, "qs", cmdArgs...)
cmd.WaitDelay = 500 * time.Millisecond
var targets ipcTargets var targets ipcTargets
if output, err := cmd.Output(); err == nil { if output, err := cmd.Output(); err == nil {
@@ -665,7 +623,7 @@ func getShellIPCCompletions(args []string, _ string) []string {
if len(args) == 0 { if len(args) == 0 {
targetNames := make([]string, 0) targetNames := make([]string, 0)
targetNames = append(targetNames, "call", "list") targetNames = append(targetNames, "call")
for k := range targets { for k := range targets {
targetNames = append(targetNames, k) targetNames = append(targetNames, k)
} }
@@ -728,64 +686,6 @@ func getFirstDMSPID() (int, bool) {
return 0, false return 0, false
} }
func sessionParentPID(display string) (int, bool) {
if display == "" {
return 0, false
}
dir := getRuntimeDir()
entries, err := os.ReadDir(dir)
if err != nil {
return 0, false
}
for _, entry := range entries {
name := entry.Name()
if !strings.HasPrefix(name, "danklinux-") || !strings.HasSuffix(name, ".session") {
continue
}
data, err := os.ReadFile(filepath.Join(dir, name))
if err != nil || strings.TrimSpace(string(data)) != display {
continue
}
parentStr := strings.TrimSuffix(strings.TrimPrefix(name, "danklinux-"), ".session")
parentPID, err := strconv.Atoi(parentStr)
if err != nil {
continue
}
return parentPID, true
}
return 0, false
}
func getSessionDMSPID() (int, bool) {
parentPID, ok := sessionParentPID(os.Getenv("WAYLAND_DISPLAY"))
if !ok {
return getFirstDMSPID()
}
data, err := os.ReadFile(filepath.Join(getRuntimeDir(), fmt.Sprintf("danklinux-%d.pid", parentPID)))
if err != nil {
return getFirstDMSPID()
}
pid, err := strconv.Atoi(strings.TrimSpace(string(data)))
if err != nil {
return getFirstDMSPID()
}
proc, err := os.FindProcess(pid)
if err != nil || proc.Signal(syscall.Signal(0)) != nil {
return getFirstDMSPID()
}
return pid, true
}
func runShellIPCCommand(args []string) { func runShellIPCCommand(args []string) {
if len(args) == 0 { if len(args) == 0 {
printIPCHelp() printIPCHelp()
@@ -796,11 +696,23 @@ func runShellIPCCommand(args []string) {
args = append([]string{"call"}, args...) args = append([]string{"call"}, args...)
} }
baseArgs, err := buildQsIPCBaseArgs() cmdArgs := []string{"ipc"}
if err != nil {
log.Fatalf("Error finding config: %v", err) switch pid, ok := getFirstDMSPID(); {
case ok:
cmdArgs = append(cmdArgs, "--pid", strconv.Itoa(pid))
default:
if err := findConfig(nil, nil); err != nil {
log.Fatalf("Error finding config: %v", err)
}
// ! TODO - remove check when QS 0.3 is released
if qsHasAnyDisplay() {
cmdArgs = append(cmdArgs, "--any-display")
}
cmdArgs = append(cmdArgs, "-p", configPath)
} }
cmdArgs := append(baseArgs, args...)
cmdArgs = append(cmdArgs, args...)
cmd := exec.Command("qs", cmdArgs...) cmd := exec.Command("qs", cmdArgs...)
cmd.Stdin = os.Stdin cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
@@ -812,20 +724,19 @@ func runShellIPCCommand(args []string) {
} }
func printIPCHelp() { func printIPCHelp() {
fmt.Println("Usage: dms ipc call <target> <function> [args...]") fmt.Println("Usage: dms ipc <target> <function> [args...]")
fmt.Println() fmt.Println()
baseArgs, err := buildQsIPCBaseArgs() cmdArgs := []string{"ipc"}
if err != nil { if qsHasAnyDisplay() {
printIPCHelpFailure(err) cmdArgs = append(cmdArgs, "--any-display")
return
} }
cmdArgs := append(baseArgs, "show") cmdArgs = append(cmdArgs, "-p", configPath, "show")
cmd := exec.Command("qs", cmdArgs...) cmd := exec.Command("qs", cmdArgs...)
output, err := cmd.Output() output, err := cmd.Output()
if err != nil { if err != nil {
printIPCHelpFailure(err) fmt.Println("Could not retrieve available IPC targets (is DMS running?)")
return return
} }
@@ -854,16 +765,6 @@ func printIPCHelp() {
} }
} }
func printIPCHelpFailure(err error) {
fmt.Println("Could not retrieve IPC targets.")
if err != nil {
fmt.Printf(" %v\n", err)
}
fmt.Println()
fmt.Println(" Full docs: https://danklinux.com/docs/dankmaterialshell/keybinds-ipc")
fmt.Println(" Try: dms ipc call <target> <function>")
}
// ensureFontCache rebuilds the fontconfig cache if user-configured fonts are missing while skipping defaults // ensureFontCache rebuilds the fontconfig cache if user-configured fonts are missing while skipping defaults
func ensureFontCache() { func ensureFontCache() {
if _, err := exec.LookPath("fc-list"); err != nil { if _, err := exec.LookPath("fc-list"); err != nil {
+1 -1
View File
@@ -22,6 +22,7 @@ require (
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
go.etcd.io/bbolt v1.4.3 go.etcd.io/bbolt v1.4.3
go4.org/mem v0.0.0-20240501181205-ae6ca9944745 go4.org/mem v0.0.0-20240501181205-ae6ca9944745
golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f
golang.org/x/image v0.39.0 golang.org/x/image v0.39.0
tailscale.com v1.96.5 tailscale.com v1.96.5
) )
@@ -63,7 +64,6 @@ require (
github.com/yeqown/reedsolomon v1.0.0 // indirect github.com/yeqown/reedsolomon v1.0.0 // indirect
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
golang.org/x/crypto v0.50.0 // indirect golang.org/x/crypto v0.50.0 // indirect
golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect
golang.org/x/net v0.53.0 // indirect golang.org/x/net v0.53.0 // indirect
golang.org/x/sync v0.20.0 // indirect golang.org/x/sync v0.20.0 // indirect
golang.zx2c4.com/wireguard/windows v1.0.1 // indirect golang.zx2c4.com/wireguard/windows v1.0.1 // indirect
+316 -144
View File
@@ -9,6 +9,7 @@ import (
"syscall" "syscall"
"github.com/AvengeMedia/DankMaterialShell/core/internal/proto/ext_data_control" "github.com/AvengeMedia/DankMaterialShell/core/internal/proto/ext_data_control"
wlclient "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
) )
const envServe = "_DMS_CLIPBOARD_SERVE" const envServe = "_DMS_CLIPBOARD_SERVE"
@@ -16,37 +17,6 @@ const envMime = "_DMS_CLIPBOARD_MIME"
const envPasteOnce = "_DMS_CLIPBOARD_PASTE_ONCE" const envPasteOnce = "_DMS_CLIPBOARD_PASTE_ONCE"
const envCacheFile = "_DMS_CLIPBOARD_CACHE" const envCacheFile = "_DMS_CLIPBOARD_CACHE"
type Offer struct {
MimeType string
Data []byte
}
// textMimeAliases are offered alongside plain-text content so legacy X11
// clients bridged through XWayland find a target they can convert.
var textMimeAliases = []string{
"text/plain",
"text/plain;charset=utf-8",
"UTF8_STRING",
"STRING",
"TEXT",
}
// ExpandOffers turns raw clipboard data into the full offer list to serve,
// adding the standard alias set for text content.
func ExpandOffers(data []byte, mimeType string) []Offer {
offers := []Offer{{MimeType: mimeType, Data: data}}
if mimeType != "text/plain" && mimeType != "text/plain;charset=utf-8" {
return offers
}
for _, alias := range textMimeAliases {
if alias == mimeType {
continue
}
offers = append(offers, Offer{MimeType: alias, Data: data})
}
return offers
}
// MaybeServeAndExit intercepts before cobra when re-exec'd as a clipboard // MaybeServeAndExit intercepts before cobra when re-exec'd as a clipboard
// child. Reads source data into memory, deletes any cache file, then serves. // child. Reads source data into memory, deletes any cache file, then serves.
func MaybeServeAndExit() { func MaybeServeAndExit() {
@@ -74,7 +44,7 @@ func MaybeServeAndExit() {
os.Exit(1) os.Exit(1)
} }
if err := serveOffers(ExpandOffers(data, mimeType), pasteOnce); err != nil { if err := serveClipboard(data, mimeType, pasteOnce); err != nil {
fmt.Fprintf(os.Stderr, "clipboard: serve: %v\n", err) fmt.Fprintf(os.Stderr, "clipboard: serve: %v\n", err)
os.Exit(1) os.Exit(1)
} }
@@ -85,33 +55,22 @@ func Copy(data []byte, mimeType string) error {
return copyForkCached(data, mimeType, false) return copyForkCached(data, mimeType, false)
} }
func CopyText(text string) error {
return Copy([]byte(text), "text/plain;charset=utf-8")
}
func CopyOpts(data []byte, mimeType string, foreground, pasteOnce bool) error { func CopyOpts(data []byte, mimeType string, foreground, pasteOnce bool) error {
if foreground { if foreground {
return serveOffers(ExpandOffers(data, mimeType), pasteOnce) return serveClipboard(data, mimeType, pasteOnce)
} }
return copyForkCached(data, mimeType, pasteOnce) return copyForkCached(data, mimeType, pasteOnce)
} }
func CopyReader(data io.Reader, mimeType string, foreground, pasteOnce bool) error { func CopyReader(data io.Reader, mimeType string, foreground, pasteOnce bool) error {
if !foreground {
return copyFork(data, mimeType, pasteOnce)
}
buf, err := io.ReadAll(data)
if err != nil {
return fmt.Errorf("read source: %w", err)
}
return serveOffers(ExpandOffers(buf, mimeType), pasteOnce)
}
func CopyMulti(offers []Offer, foreground, pasteOnce bool) error {
if foreground { if foreground {
return serveOffers(offers, pasteOnce) buf, err := io.ReadAll(data)
if err != nil {
return fmt.Errorf("read source: %w", err)
}
return serveClipboard(buf, mimeType, pasteOnce)
} }
return copyMultiFork(offers, pasteOnce) return copyFork(data, mimeType, pasteOnce)
} }
func newForkCmd(mimeType string, pasteOnce bool, extra ...string) *exec.Cmd { func newForkCmd(mimeType string, pasteOnce bool, extra ...string) *exec.Cmd {
@@ -173,70 +132,39 @@ func copyForkCached(data []byte, mimeType string, pasteOnce bool) error {
func copyFork(data io.Reader, mimeType string, pasteOnce bool) error { func copyFork(data io.Reader, mimeType string, pasteOnce bool) error {
cmd := newForkCmd(mimeType, pasteOnce) cmd := newForkCmd(mimeType, pasteOnce)
if src, ok := data.(*os.File); ok { switch src := data.(type) {
case *os.File:
cmd.Stdin = src cmd.Stdin = src
return waitReady(cmd) return waitReady(cmd)
}
stdin, err := cmd.StdinPipe() default:
if err != nil { stdin, err := cmd.StdinPipe()
return fmt.Errorf("stdin pipe: %w", err) if err != nil {
} return fmt.Errorf("stdin pipe: %w", err)
stdout, err := cmd.StdoutPipe()
if err != nil {
return fmt.Errorf("stdout pipe: %w", err)
}
if err := cmd.Start(); err != nil {
return fmt.Errorf("start: %w", err)
}
if _, err := io.Copy(stdin, data); err != nil {
stdin.Close()
return fmt.Errorf("write stdin: %w", err)
}
if err := stdin.Close(); err != nil {
return fmt.Errorf("close stdin: %w", err)
}
var buf [1]byte
if _, err := stdout.Read(buf[:]); err != nil {
return fmt.Errorf("waiting for clipboard ready: %w", err)
}
return nil
}
func copyMultiFork(offers []Offer, pasteOnce bool) error {
args := []string{os.Args[0], "cl", "copy", "--foreground", "--type", "__multi__"}
if pasteOnce {
args = append(args, "--paste-once")
}
cmd := exec.Command(args[0], args[1:]...)
cmd.Stdin = nil
cmd.Stdout = nil
cmd.Stderr = nil
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
stdin, err := cmd.StdinPipe()
if err != nil {
return fmt.Errorf("stdin pipe: %w", err)
}
if err := cmd.Start(); err != nil {
return fmt.Errorf("start: %w", err)
}
for _, offer := range offers {
fmt.Fprintf(stdin, "%s\x00%d\x00", offer.MimeType, len(offer.Data))
if _, err := stdin.Write(offer.Data); err != nil {
stdin.Close()
return fmt.Errorf("write offer data: %w", err)
} }
}
stdin.Close()
return nil stdout, err := cmd.StdoutPipe()
if err != nil {
return fmt.Errorf("stdout pipe: %w", err)
}
if err := cmd.Start(); err != nil {
return fmt.Errorf("start: %w", err)
}
if _, err := io.Copy(stdin, data); err != nil {
stdin.Close()
return fmt.Errorf("write stdin: %w", err)
}
if err := stdin.Close(); err != nil {
return fmt.Errorf("close stdin: %w", err)
}
var buf [1]byte
if _, err := stdout.Read(buf[:]); err != nil {
return fmt.Errorf("waiting for clipboard ready: %w", err)
}
return nil
}
} }
func signalReady() { func signalReady() {
@@ -266,25 +194,57 @@ func createClipboardCacheFile() (*os.File, error) {
return os.CreateTemp("", "dms-clipboard-*") return os.CreateTemp("", "dms-clipboard-*")
} }
// serveOffers owns the Wayland selection until cancelled (or first paste when func serveClipboard(data []byte, mimeType string, pasteOnce bool) error {
// pasteOnce is set), answering every offered mime type with its data. display, err := wlclient.Connect("")
func serveOffers(offers []Offer, pasteOnce bool) error {
if len(offers) == 0 {
return fmt.Errorf("no offers to serve")
}
s, err := connectSession()
if err != nil { if err != nil {
return err return fmt.Errorf("wayland connect: %w", err)
} }
defer s.Close() defer display.Destroy()
dataControlMgr, err := s.requireDataControl() ctx := display.Context()
registry, err := display.GetRegistry()
if err != nil { if err != nil {
return err return fmt.Errorf("get registry: %w", err)
}
defer registry.Destroy()
var dataControlMgr *ext_data_control.ExtDataControlManagerV1
var seat *wlclient.Seat
var bindErr error
registry.SetGlobalHandler(func(e wlclient.RegistryGlobalEvent) {
switch e.Interface {
case "ext_data_control_manager_v1":
dataControlMgr = ext_data_control.NewExtDataControlManagerV1(ctx)
if err := registry.Bind(e.Name, e.Interface, e.Version, dataControlMgr); err != nil {
bindErr = err
}
case "wl_seat":
if seat != nil {
return
}
seat = wlclient.NewSeat(ctx)
if err := registry.Bind(e.Name, e.Interface, e.Version, seat); err != nil {
bindErr = err
}
}
})
display.Roundtrip()
display.Roundtrip()
if bindErr != nil {
return fmt.Errorf("registry bind: %w", bindErr)
}
if dataControlMgr == nil {
return fmt.Errorf("compositor does not support ext_data_control_manager_v1")
}
defer dataControlMgr.Destroy()
if seat == nil {
return fmt.Errorf("no seat available")
} }
device, err := dataControlMgr.GetDataDevice(s.seat) device, err := dataControlMgr.GetDataDevice(seat)
if err != nil { if err != nil {
return fmt.Errorf("get data device: %w", err) return fmt.Errorf("get data device: %w", err)
} }
@@ -295,12 +255,25 @@ func serveOffers(offers []Offer, pasteOnce bool) error {
return fmt.Errorf("create data source: %w", err) return fmt.Errorf("create data source: %w", err)
} }
offerData := make(map[string][]byte, len(offers)) if err := source.Offer(mimeType); err != nil {
for _, offer := range offers { return fmt.Errorf("offer mime type: %w", err)
if err := source.Offer(offer.MimeType); err != nil { }
return fmt.Errorf("offer %s: %w", offer.MimeType, err) if mimeType == "text/plain;charset=utf-8" || mimeType == "text/plain" {
if err := source.Offer("text/plain"); err != nil {
return fmt.Errorf("offer text/plain: %w", err)
}
if err := source.Offer("text/plain;charset=utf-8"); err != nil {
return fmt.Errorf("offer text/plain;charset=utf-8: %w", err)
}
if err := source.Offer("UTF8_STRING"); err != nil {
return fmt.Errorf("offer UTF8_STRING: %w", err)
}
if err := source.Offer("STRING"); err != nil {
return fmt.Errorf("offer STRING: %w", err)
}
if err := source.Offer("TEXT"); err != nil {
return fmt.Errorf("offer TEXT: %w", err)
} }
offerData[offer.MimeType] = offer.Data
} }
cancelled := make(chan struct{}) cancelled := make(chan struct{})
@@ -310,11 +283,7 @@ func serveOffers(offers []Offer, pasteOnce bool) error {
_ = syscall.SetNonblock(e.Fd, false) _ = syscall.SetNonblock(e.Fd, false)
file := os.NewFile(uintptr(e.Fd), "pipe") file := os.NewFile(uintptr(e.Fd), "pipe")
defer file.Close() defer file.Close()
_, _ = file.Write(data)
if data, ok := offerData[e.MimeType]; ok {
_, _ = file.Write(data)
}
select { select {
case pasted <- struct{}{}: case pasted <- struct{}{}:
default: default:
@@ -329,7 +298,7 @@ func serveOffers(offers []Offer, pasteOnce bool) error {
return fmt.Errorf("set selection: %w", err) return fmt.Errorf("set selection: %w", err)
} }
s.display.Roundtrip() display.Roundtrip()
signalReady() signalReady()
for { for {
@@ -341,26 +310,70 @@ func serveOffers(offers []Offer, pasteOnce bool) error {
return nil return nil
} }
default: default:
if err := s.ctx.Dispatch(); err != nil { if err := ctx.Dispatch(); err != nil {
return nil return nil
} }
} }
} }
} }
func CopyText(text string) error {
return Copy([]byte(text), "text/plain;charset=utf-8")
}
func Paste() ([]byte, string, error) { func Paste() ([]byte, string, error) {
s, err := connectSession() display, err := wlclient.Connect("")
if err != nil { if err != nil {
return nil, "", err return nil, "", fmt.Errorf("wayland connect: %w", err)
} }
defer s.Close() defer display.Destroy()
dataControlMgr, err := s.requireDataControl() ctx := display.Context()
registry, err := display.GetRegistry()
if err != nil { if err != nil {
return nil, "", err return nil, "", fmt.Errorf("get registry: %w", err)
}
defer registry.Destroy()
var dataControlMgr *ext_data_control.ExtDataControlManagerV1
var seat *wlclient.Seat
var bindErr error
registry.SetGlobalHandler(func(e wlclient.RegistryGlobalEvent) {
switch e.Interface {
case "ext_data_control_manager_v1":
dataControlMgr = ext_data_control.NewExtDataControlManagerV1(ctx)
if err := registry.Bind(e.Name, e.Interface, e.Version, dataControlMgr); err != nil {
bindErr = err
}
case "wl_seat":
if seat != nil {
return
}
seat = wlclient.NewSeat(ctx)
if err := registry.Bind(e.Name, e.Interface, e.Version, seat); err != nil {
bindErr = err
}
}
})
display.Roundtrip()
display.Roundtrip()
if bindErr != nil {
return nil, "", fmt.Errorf("registry bind: %w", bindErr)
} }
device, err := dataControlMgr.GetDataDevice(s.seat) if dataControlMgr == nil {
return nil, "", fmt.Errorf("compositor does not support ext_data_control_manager_v1")
}
defer dataControlMgr.Destroy()
if seat == nil {
return nil, "", fmt.Errorf("no seat available")
}
device, err := dataControlMgr.GetDataDevice(seat)
if err != nil { if err != nil {
return nil, "", fmt.Errorf("get data device: %w", err) return nil, "", fmt.Errorf("get data device: %w", err)
} }
@@ -386,14 +399,15 @@ func Paste() ([]byte, string, error) {
gotSelection = true gotSelection = true
}) })
s.display.Roundtrip() display.Roundtrip()
s.display.Roundtrip() display.Roundtrip()
if !gotSelection || selectionOffer == nil { if !gotSelection || selectionOffer == nil {
return nil, "", fmt.Errorf("no clipboard data") return nil, "", fmt.Errorf("no clipboard data")
} }
selectedMime := selectPreferredMimeType(offerMimeTypes[selectionOffer]) mimeTypes := offerMimeTypes[selectionOffer]
selectedMime := selectPreferredMimeType(mimeTypes)
if selectedMime == "" { if selectedMime == "" {
return nil, "", fmt.Errorf("no supported mime type") return nil, "", fmt.Errorf("no supported mime type")
} }
@@ -410,7 +424,7 @@ func Paste() ([]byte, string, error) {
} }
w.Close() w.Close()
s.display.Roundtrip() display.Roundtrip()
data, err := io.ReadAll(r) data, err := io.ReadAll(r)
if err != nil { if err != nil {
@@ -456,3 +470,161 @@ func selectPreferredMimeType(mimes []string) string {
func IsImageMimeType(mime string) bool { func IsImageMimeType(mime string) bool {
return len(mime) > 6 && mime[:6] == "image/" return len(mime) > 6 && mime[:6] == "image/"
} }
type Offer struct {
MimeType string
Data []byte
}
func CopyMulti(offers []Offer, foreground, pasteOnce bool) error {
if !foreground {
return copyMultiFork(offers, pasteOnce)
}
return copyMultiServe(offers, pasteOnce)
}
func copyMultiFork(offers []Offer, pasteOnce bool) error {
args := []string{os.Args[0], "cl", "copy", "--foreground", "--type", "__multi__"}
if pasteOnce {
args = append(args, "--paste-once")
}
cmd := exec.Command(args[0], args[1:]...)
cmd.Stdin = nil
cmd.Stdout = nil
cmd.Stderr = nil
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
stdin, err := cmd.StdinPipe()
if err != nil {
return fmt.Errorf("stdin pipe: %w", err)
}
if err := cmd.Start(); err != nil {
return fmt.Errorf("start: %w", err)
}
for _, offer := range offers {
fmt.Fprintf(stdin, "%s\x00%d\x00", offer.MimeType, len(offer.Data))
if _, err := stdin.Write(offer.Data); err != nil {
stdin.Close()
return fmt.Errorf("write offer data: %w", err)
}
}
stdin.Close()
return nil
}
func copyMultiServe(offers []Offer, pasteOnce bool) error {
display, err := wlclient.Connect("")
if err != nil {
return fmt.Errorf("wayland connect: %w", err)
}
defer display.Destroy()
ctx := display.Context()
registry, err := display.GetRegistry()
if err != nil {
return fmt.Errorf("get registry: %w", err)
}
defer registry.Destroy()
var dataControlMgr *ext_data_control.ExtDataControlManagerV1
var seat *wlclient.Seat
var bindErr error
registry.SetGlobalHandler(func(e wlclient.RegistryGlobalEvent) {
switch e.Interface {
case "ext_data_control_manager_v1":
dataControlMgr = ext_data_control.NewExtDataControlManagerV1(ctx)
if err := registry.Bind(e.Name, e.Interface, e.Version, dataControlMgr); err != nil {
bindErr = err
}
case "wl_seat":
if seat != nil {
return
}
seat = wlclient.NewSeat(ctx)
if err := registry.Bind(e.Name, e.Interface, e.Version, seat); err != nil {
bindErr = err
}
}
})
display.Roundtrip()
display.Roundtrip()
if bindErr != nil {
return fmt.Errorf("registry bind: %w", bindErr)
}
if dataControlMgr == nil {
return fmt.Errorf("compositor does not support ext_data_control_manager_v1")
}
defer dataControlMgr.Destroy()
if seat == nil {
return fmt.Errorf("no seat available")
}
device, err := dataControlMgr.GetDataDevice(seat)
if err != nil {
return fmt.Errorf("get data device: %w", err)
}
defer device.Destroy()
source, err := dataControlMgr.CreateDataSource()
if err != nil {
return fmt.Errorf("create data source: %w", err)
}
offerMap := make(map[string][]byte)
for _, offer := range offers {
if err := source.Offer(offer.MimeType); err != nil {
return fmt.Errorf("offer %s: %w", offer.MimeType, err)
}
offerMap[offer.MimeType] = offer.Data
}
cancelled := make(chan struct{})
pasted := make(chan struct{}, 1)
source.SetSendHandler(func(e ext_data_control.ExtDataControlSourceV1SendEvent) {
_ = syscall.SetNonblock(e.Fd, false)
file := os.NewFile(uintptr(e.Fd), "pipe")
defer file.Close()
if data, ok := offerMap[e.MimeType]; ok {
_, _ = file.Write(data)
}
select {
case pasted <- struct{}{}:
default:
}
})
source.SetCancelledHandler(func(e ext_data_control.ExtDataControlSourceV1CancelledEvent) {
close(cancelled)
})
if err := device.SetSelection(source); err != nil {
return fmt.Errorf("set selection: %w", err)
}
display.Roundtrip()
for {
select {
case <-cancelled:
return nil
case <-pasted:
if pasteOnce {
return nil
}
default:
if err := ctx.Dispatch(); err != nil {
return nil
}
}
}
}
-206
View File
@@ -1,206 +0,0 @@
package clipboard
import (
"fmt"
"regexp"
"strconv"
"strings"
wlclient "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
"golang.org/x/sys/unix"
)
const (
xkbKeymapFormatV1 = 1
keyStateReleased = 0
keyStatePressed = 1
// xkb real modifier bit positions are fixed: Shift=0, Lock=1, Control=2
shiftModMask = 1 << 0
ctrlModMask = 1 << 2
// evdev fallbacks for a standard pc105 map
fallbackCtrlKey = 29 // KEY_LEFTCTRL
fallbackShiftKey = 42 // KEY_LEFTSHIFT
fallbackVKey = 47 // KEY_V
)
// SendPasteKeystroke emulates a paste shortcut via zwp_virtual_keyboard_v1
// using the seat's own keymap, so keycodes stay valid for XWayland clients
// (a synthetic wtype-style keymap breaks X11 apps like Steam). withShift
// selects ctrl+shift+v for terminal targets.
func SendPasteKeystroke(withShift bool) error {
s, err := connectSession()
if err != nil {
return err
}
defer s.Close()
if s.virtualKeyboardMgr == nil {
return fmt.Errorf("compositor does not support zwp_virtual_keyboard_manager_v1")
}
if s.seat == nil {
return fmt.Errorf("no seat available")
}
keyboard, err := s.seat.GetKeyboard()
if err != nil {
return fmt.Errorf("get keyboard: %w", err)
}
defer keyboard.Release()
var keymap *wlclient.KeyboardKeymapEvent
keyboard.SetKeymapHandler(func(e wlclient.KeyboardKeymapEvent) {
if keymap == nil {
keymap = &e
}
})
s.display.Roundtrip()
if keymap == nil || keymap.Format != xkbKeymapFormatV1 {
return fmt.Errorf("no xkb keymap from seat")
}
defer unix.Close(keymap.Fd)
keymapText, err := readKeymap(keymap.Fd, keymap.Size)
if err != nil {
return fmt.Errorf("read keymap: %w", err)
}
keys := resolveKeycodes(keymapText)
vk, err := s.virtualKeyboardMgr.CreateVirtualKeyboard(s.seat)
if err != nil {
return fmt.Errorf("create virtual keyboard: %w", err)
}
defer vk.Destroy()
if err := vk.Keymap(xkbKeymapFormatV1, keymap.Fd, keymap.Size); err != nil {
return fmt.Errorf("set keymap: %w", err)
}
mods := uint32(ctrlModMask)
held := []uint32{keys.ctrl}
if withShift {
mods |= shiftModMask
held = append(held, keys.shift)
}
t := uint32(0)
press := func(key, state uint32) error {
t++
return vk.Key(t, key, state)
}
for _, key := range held {
if err := press(key, keyStatePressed); err != nil {
return fmt.Errorf("key press: %w", err)
}
}
if err := vk.Modifiers(mods, 0, 0, 0); err != nil {
return fmt.Errorf("set modifiers: %w", err)
}
if err := press(keys.v, keyStatePressed); err != nil {
return fmt.Errorf("key press: %w", err)
}
if err := press(keys.v, keyStateReleased); err != nil {
return fmt.Errorf("key release: %w", err)
}
for i := len(held) - 1; i >= 0; i-- {
if err := press(held[i], keyStateReleased); err != nil {
return fmt.Errorf("key release: %w", err)
}
}
if err := vk.Modifiers(0, 0, 0, 0); err != nil {
return fmt.Errorf("clear modifiers: %w", err)
}
s.display.Roundtrip()
return nil
}
func readKeymap(fd int, size uint32) (string, error) {
data, err := unix.Mmap(fd, 0, int(size), unix.PROT_READ, unix.MAP_PRIVATE)
if err != nil {
return "", err
}
text := strings.TrimRight(string(data), "\x00")
return text, unix.Munmap(data)
}
type pasteKeycodes struct {
ctrl uint32
shift uint32
v uint32
}
var (
keycodeDefRe = regexp.MustCompile(`<([A-Za-z0-9+_-]+)>\s*=\s*(\d+)`)
keySymbolsRe = regexp.MustCompile(`key\s*<([A-Za-z0-9+_-]+)>\s*\{([^}]*)\}`)
groupIndexRe = regexp.MustCompile(`\w+\[\d+\]\s*=`)
symbolListRe = regexp.MustCompile(`\[([^\]]*)\]`)
)
// xkbcommon may serialize keysyms as hex escapes instead of names
// (e.g. "0x76" for v, "0xffe3" for Control_L).
var keysymNames = map[uint32]string{
0x76: "v",
0xffe3: "Control_L",
0xffe1: "Shift_L",
}
func canonicalKeysym(sym string) string {
if !strings.HasPrefix(sym, "0x") && !strings.HasPrefix(sym, "0X") {
return sym
}
value, err := strconv.ParseUint(sym[2:], 16, 32)
if err != nil {
return sym
}
if name, ok := keysymNames[uint32(value)]; ok {
return name
}
return sym
}
// resolveKeycodes finds the evdev keycodes producing the keysyms we need in
// the seat keymap's first group, falling back to pc105 positions.
func resolveKeycodes(keymap string) pasteKeycodes {
codes := map[string]uint32{}
for _, m := range keycodeDefRe.FindAllStringSubmatch(keymap, -1) {
if code, err := strconv.Atoi(m[2]); err == nil {
codes[m[1]] = uint32(code)
}
}
keys := pasteKeycodes{ctrl: fallbackCtrlKey, shift: fallbackShiftKey, v: fallbackVKey}
want := map[string]*uint32{
"Control_L": &keys.ctrl,
"Shift_L": &keys.shift,
"v": &keys.v,
}
for _, m := range keySymbolsRe.FindAllStringSubmatch(keymap, -1) {
group := symbolListRe.FindStringSubmatch(groupIndexRe.ReplaceAllString(m[2], ""))
if group == nil {
continue
}
xkbCode, ok := codes[m[1]]
if !ok || xkbCode < 8 {
continue
}
level1 := canonicalKeysym(strings.TrimSpace(strings.Split(group[1], ",")[0]))
target, wanted := want[level1]
if !wanted {
continue
}
*target = xkbCode - 8
delete(want, level1)
if len(want) == 0 {
break
}
}
return keys
}
@@ -1,65 +0,0 @@
package clipboard
import (
"os"
"testing"
wlclient "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
"golang.org/x/sys/unix"
)
func TestLiveSeatKeymapResolution(t *testing.T) {
if os.Getenv("DMS_LIVE_TEST") == "" {
t.Skip("set DMS_LIVE_TEST=1 to run against the live compositor")
}
s, err := connectSession()
if err != nil {
t.Fatalf("connect: %v", err)
}
defer s.Close()
if s.virtualKeyboardMgr == nil {
t.Fatal("compositor does not advertise zwp_virtual_keyboard_manager_v1")
}
if s.seat == nil {
t.Fatal("no seat")
}
keyboard, err := s.seat.GetKeyboard()
if err != nil {
t.Fatalf("get keyboard: %v", err)
}
defer keyboard.Release()
var keymap *wlclient.KeyboardKeymapEvent
keyboard.SetKeymapHandler(func(e wlclient.KeyboardKeymapEvent) {
if keymap == nil {
keymap = &e
}
})
s.display.Roundtrip()
if keymap == nil {
t.Fatal("no keymap event")
}
defer unix.Close(keymap.Fd)
text, err := readKeymap(keymap.Fd, keymap.Size)
if err != nil {
t.Fatalf("read keymap: %v", err)
}
if dump := os.Getenv("DMS_LIVE_DUMP"); dump != "" {
if err := os.WriteFile(dump, []byte(text), 0o644); err != nil {
t.Fatalf("dump keymap: %v", err)
}
}
keys := resolveKeycodes(text)
t.Logf("keymap size=%d resolved ctrl=%d shift=%d v=%d", keymap.Size, keys.ctrl, keys.shift, keys.v)
if keys.ctrl == fallbackCtrlKey && keys.shift == fallbackShiftKey && keys.v == fallbackVKey {
t.Log("all keycodes are fallbacks - parsing may not have matched the live keymap")
}
}
-105
View File
@@ -1,105 +0,0 @@
package clipboard
import "testing"
const qwertyKeymap = `xkb_keymap {
xkb_keycodes "(unnamed)" {
minimum = 8;
maximum = 708;
<ESC> = 9;
<AB04> = 55;
<LCTL> = 37;
<LFSH> = 50;
alias <AL01> = <AC01>;
indicator 1 = "Caps Lock";
};
xkb_types "(unnamed)" {
type "ALPHABETIC" {
modifiers = Shift+Lock;
map[Shift] = Level2;
level_name[Level1] = "Base";
};
};
xkb_symbols "(unnamed)" {
key <ESC> { [ Escape ] };
key <AB04> { type= "ALPHABETIC", [ v, V ] };
key <LCTL> { [ Control_L ] };
key <LFSH> { [ Shift_L ] };
};
};`
const hexKeymap = `xkb_keymap {
xkb_keycodes "(unnamed)" {
<AB04> = 56;
<LCTL> = 38;
<LFSH> = 51;
};
xkb_symbols "(unnamed)" {
key <LCTL> { [ 0xffe3 ] };
key <LFSH> {
type= "PC_ALT_LEVEL2",
symbols[1]= [ 0xffe1, 0xfe08 ]
};
key <AB04> { [ 0x76, 0x56 ] };
};
};`
const dvorakKeymap = `xkb_keymap {
xkb_keycodes "(unnamed)" {
<AB09> = 60;
<LCTL> = 37;
<LFSH> = 50;
};
xkb_symbols "(unnamed)" {
key <AB09> { [ v, V ] };
key <LCTL> { [ Control_L ] };
key <LFSH> { [ Shift_L ] };
};
};`
func TestResolveKeycodes(t *testing.T) {
tests := []struct {
name string
keymap string
want pasteKeycodes
}{
{"qwerty", qwertyKeymap, pasteKeycodes{ctrl: 29, shift: 42, v: 47}},
{"dvorak", dvorakKeymap, pasteKeycodes{ctrl: 29, shift: 42, v: 52}},
{"hex keysyms", hexKeymap, pasteKeycodes{ctrl: 30, shift: 43, v: 48}},
{"empty falls back", "", pasteKeycodes{ctrl: fallbackCtrlKey, shift: fallbackShiftKey, v: fallbackVKey}},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := resolveKeycodes(tt.keymap)
if got != tt.want {
t.Errorf("resolveKeycodes() = %+v, want %+v", got, tt.want)
}
})
}
}
func TestExpandOffers(t *testing.T) {
text := ExpandOffers([]byte("hi"), "text/plain;charset=utf-8")
if len(text) != 5 {
t.Fatalf("expected 5 text offers, got %d", len(text))
}
seen := map[string]bool{}
for _, o := range text {
if string(o.Data) != "hi" {
t.Errorf("offer %s has wrong data", o.MimeType)
}
if seen[o.MimeType] {
t.Errorf("duplicate offer %s", o.MimeType)
}
seen[o.MimeType] = true
}
if !seen["UTF8_STRING"] || !seen["STRING"] || !seen["TEXT"] || !seen["text/plain"] {
t.Errorf("missing X11 alias offers: %v", seen)
}
img := ExpandOffers([]byte{1}, "image/png")
if len(img) != 1 || img[0].MimeType != "image/png" {
t.Errorf("non-text mime should not expand, got %+v", img)
}
}
-93
View File
@@ -1,93 +0,0 @@
package clipboard
import (
"fmt"
"github.com/AvengeMedia/DankMaterialShell/core/internal/proto/ext_data_control"
"github.com/AvengeMedia/DankMaterialShell/core/internal/proto/virtual_keyboard"
wlclient "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
)
type session struct {
display *wlclient.Display
ctx *wlclient.Context
registry *wlclient.Registry
seat *wlclient.Seat
dataControlMgr *ext_data_control.ExtDataControlManagerV1
virtualKeyboardMgr *virtual_keyboard.ZwpVirtualKeyboardManagerV1
}
// connectSession opens a short-lived Wayland connection and binds the seat
// plus whichever clipboard-related globals the compositor advertises.
func connectSession() (*session, error) {
display, err := wlclient.Connect("")
if err != nil {
return nil, fmt.Errorf("wayland connect: %w", err)
}
s := &session{display: display, ctx: display.Context()}
registry, err := display.GetRegistry()
if err != nil {
display.Destroy()
return nil, fmt.Errorf("get registry: %w", err)
}
s.registry = registry
var bindErr error
bind := func(name uint32, iface string, version uint32, proxy wlclient.Proxy) {
if err := registry.Bind(name, iface, version, proxy); err != nil {
bindErr = fmt.Errorf("bind %s: %w", iface, err)
}
}
registry.SetGlobalHandler(func(e wlclient.RegistryGlobalEvent) {
switch e.Interface {
case ext_data_control.ExtDataControlManagerV1InterfaceName:
mgr := ext_data_control.NewExtDataControlManagerV1(s.ctx)
bind(e.Name, e.Interface, e.Version, mgr)
s.dataControlMgr = mgr
case virtual_keyboard.ZwpVirtualKeyboardManagerV1InterfaceName:
mgr := virtual_keyboard.NewZwpVirtualKeyboardManagerV1(s.ctx)
bind(e.Name, e.Interface, e.Version, mgr)
s.virtualKeyboardMgr = mgr
case "wl_seat":
if s.seat != nil {
return
}
seat := wlclient.NewSeat(s.ctx)
bind(e.Name, e.Interface, e.Version, seat)
s.seat = seat
}
})
display.Roundtrip()
display.Roundtrip()
if bindErr != nil {
s.Close()
return nil, bindErr
}
return s, nil
}
func (s *session) requireDataControl() (*ext_data_control.ExtDataControlManagerV1, error) {
switch {
case s.dataControlMgr == nil:
return nil, fmt.Errorf("compositor does not support ext_data_control_manager_v1")
case s.seat == nil:
return nil, fmt.Errorf("no seat available")
default:
return s.dataControlMgr, nil
}
}
func (s *session) Close() {
if s.dataControlMgr != nil {
s.dataControlMgr.Destroy()
}
if s.registry != nil {
s.registry.Destroy()
}
s.display.Destroy()
}
-4
View File
@@ -61,10 +61,6 @@ func (cd *ConfigDeployer) DeployConfigurationsSelectiveWithReinstalls(ctx contex
return cd.deployConfigurationsInternal(ctx, wm, terminal, installedDeps, replaceConfigs, reinstallItems, true) return cd.deployConfigurationsInternal(ctx, wm, terminal, installedDeps, replaceConfigs, reinstallItems, true)
} }
func (cd *ConfigDeployer) DeployConfigurationsSelectiveWithReinstallsAndSystemd(ctx context.Context, wm deps.WindowManager, terminal deps.Terminal, installedDeps []deps.Dependency, replaceConfigs map[string]bool, reinstallItems map[string]bool, useSystemd bool) ([]DeploymentResult, error) {
return cd.deployConfigurationsInternal(ctx, wm, terminal, installedDeps, replaceConfigs, reinstallItems, useSystemd)
}
func (cd *ConfigDeployer) deployConfigurationsInternal(ctx context.Context, wm deps.WindowManager, terminal deps.Terminal, installedDeps []deps.Dependency, replaceConfigs map[string]bool, reinstallItems map[string]bool, useSystemd bool) ([]DeploymentResult, error) { func (cd *ConfigDeployer) deployConfigurationsInternal(ctx context.Context, wm deps.WindowManager, terminal deps.Terminal, installedDeps []deps.Dependency, replaceConfigs map[string]bool, reinstallItems map[string]bool, useSystemd bool) ([]DeploymentResult, error) {
var results []DeploymentResult var results []DeploymentResult
+2 -2
View File
@@ -20,8 +20,8 @@ mouse-hide-while-typing = true
copy-on-select = false copy-on-select = false
confirm-close-surface = false confirm-close-surface = false
# Disable in-app Ghostty toast notifications # Disable annoying copied to clipboard
app-notifications = false app-notifications = no-clipboard-copy,no-config-reload
# Key bindings for common actions # Key bindings for common actions
#keybind = ctrl+c=copy_to_clipboard #keybind = ctrl+c=copy_to_clipboard
+1 -1
View File
@@ -9,7 +9,7 @@ hl.bind("SUPER + M", hl.dsp.exec_cmd("dms ipc call processlist focusOrToggle"))
hl.bind("SUPER + comma", hl.dsp.exec_cmd("dms ipc call settings focusOrToggle")) hl.bind("SUPER + comma", hl.dsp.exec_cmd("dms ipc call settings focusOrToggle"))
hl.bind("SUPER + N", hl.dsp.exec_cmd("dms ipc call notifications toggle")) hl.bind("SUPER + N", hl.dsp.exec_cmd("dms ipc call notifications toggle"))
hl.bind("SUPER + SHIFT + N", hl.dsp.exec_cmd("dms ipc call notepad toggle")) hl.bind("SUPER + SHIFT + N", hl.dsp.exec_cmd("dms ipc call notepad toggle"))
hl.bind("SUPER + Y", hl.dsp.exec_cmd("dms ipc call dash toggle wallpaper")) hl.bind("SUPER + Y", hl.dsp.exec_cmd("dms ipc call dankdash wallpaper"))
hl.bind("SUPER + TAB", hl.dsp.exec_cmd("dms ipc call hypr toggleOverview")) hl.bind("SUPER + TAB", hl.dsp.exec_cmd("dms ipc call hypr toggleOverview"))
hl.bind("SUPER + O", hl.dsp.exec_cmd("dms ipc call hypr toggleOverview")) hl.bind("SUPER + O", hl.dsp.exec_cmd("dms ipc call hypr toggleOverview"))
hl.bind("SUPER + X", hl.dsp.exec_cmd("dms ipc call powermenu toggle")) hl.bind("SUPER + X", hl.dsp.exec_cmd("dms ipc call powermenu toggle"))
@@ -13,7 +13,6 @@ hl.config({
input = { input = {
kb_layout = "us", kb_layout = "us",
numlock_by_default = true, numlock_by_default = true,
follow_mouse = 0,
touchpad = { touchpad = {
tap_to_click = true, tap_to_click = true,
natural_scroll = true, natural_scroll = true,
@@ -22,7 +22,7 @@ bind=SUPER,n,spawn,dms ipc call notifications toggle
# Notepad # Notepad
bind=SUPER+SHIFT,n,spawn,dms ipc call notepad toggle bind=SUPER+SHIFT,n,spawn,dms ipc call notepad toggle
# Browse Wallpapers # Browse Wallpapers
bind=SUPER,y,spawn,dms ipc call dash toggle wallpaper bind=SUPER,y,spawn,dms ipc call dankdash wallpaper
# Power Menu # Power Menu
bind=SUPER,x,spawn,dms ipc call powermenu toggle bind=SUPER,x,spawn,dms ipc call powermenu toggle
# Cycle Display Profile # Cycle Display Profile
+1 -1
View File
@@ -24,7 +24,7 @@ binds {
spawn "dms" "ipc" "call" "settings" "focusOrToggle"; spawn "dms" "ipc" "call" "settings" "focusOrToggle";
} }
Mod+Y hotkey-overlay-title="Browse Wallpapers" { Mod+Y hotkey-overlay-title="Browse Wallpapers" {
spawn "dms" "ipc" "call" "dash" "toggle" "wallpaper"; spawn "dms" "ipc" "call" "dankdash" "wallpaper";
} }
Mod+N hotkey-overlay-title="Notification Center" { spawn "dms" "ipc" "call" "notifications" "toggle"; } Mod+N hotkey-overlay-title="Notification Center" { spawn "dms" "ipc" "call" "notifications" "toggle"; }
Mod+Shift+N hotkey-overlay-title="Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; } Mod+Shift+N hotkey-overlay-title="Notepad" { spawn "dms" "ipc" "call" "notepad" "toggle"; }
@@ -20,10 +20,3 @@ window-rule {
tiled-state true tiled-state true
draw-border-with-background false draw-border-with-background false
} }
layer-rule {
exclude namespace="^dms:bar$"
background-effect {
xray false
}
}
+6 -6
View File
@@ -265,9 +265,9 @@ recent-windows {
} }
// Include dms files // Include dms files
include optional=true "dms/colors.kdl" include "dms/colors.kdl"
include optional=true "dms/layout.kdl" include "dms/layout.kdl"
include optional=true "dms/alttab.kdl" include "dms/alttab.kdl"
include optional=true "dms/binds.kdl" include "dms/binds.kdl"
include optional=true "dms/outputs.kdl" include "dms/outputs.kdl"
include optional=true "dms/cursor.kdl" include "dms/cursor.kdl"
+2 -51
View File
@@ -119,30 +119,10 @@ func (a *ArchDistribution) DetectDependenciesWithTerminal(ctx context.Context, w
dependencies = append(dependencies, a.detectMatugen()) dependencies = append(dependencies, a.detectMatugen())
dependencies = append(dependencies, a.detectDgop()) dependencies = append(dependencies, a.detectDgop())
dependencies = append(dependencies, a.detectDanksearch())
dependencies = append(dependencies, a.detectDankCalendar())
return dependencies, nil return dependencies, nil
} }
func (a *ArchDistribution) detectDanksearch() deps.Dependency {
dep := a.BaseDistribution.detectDanksearch()
dep.CanToggle = true
if a.packageInstalled("dsearch-git") {
dep.Variant = deps.VariantGit
}
return dep
}
func (a *ArchDistribution) detectDankCalendar() deps.Dependency {
dep := a.BaseDistribution.detectDankCalendar()
dep.CanToggle = true
if a.packageInstalled("dankcalendar-git") {
dep.Variant = deps.VariantGit
}
return dep
}
func (a *ArchDistribution) detectXDGPortal() deps.Dependency { func (a *ArchDistribution) detectXDGPortal() deps.Dependency {
return a.detectPackage("xdg-desktop-portal-gtk", "Desktop integration portal for GTK", a.packageInstalled("xdg-desktop-portal-gtk")) return a.detectPackage("xdg-desktop-portal-gtk", "Desktop integration portal for GTK", a.packageInstalled("xdg-desktop-portal-gtk"))
} }
@@ -152,13 +132,7 @@ func (a *ArchDistribution) detectAccountsService() deps.Dependency {
} }
func (a *ArchDistribution) detectDMSGreeter() deps.Dependency { func (a *ArchDistribution) detectDMSGreeter() deps.Dependency {
installed := a.packageInstalled("greetd-dms-greeter-git") || a.packageInstalled("greetd-dms-greeter-bin") return a.detectOptionalPackage("dms-greeter", "DankMaterialShell greetd greeter", a.packageInstalled("greetd-dms-greeter-git"))
dep := a.detectOptionalPackage("dms-greeter", "DankMaterialShell greetd greeter", installed)
dep.CanToggle = true
if a.packageInstalled("greetd-dms-greeter-git") {
dep.Variant = deps.VariantGit
}
return dep
} }
func (a *ArchDistribution) packageInstalled(pkg string) bool { func (a *ArchDistribution) packageInstalled(pkg string) bool {
@@ -217,7 +191,7 @@ func (a *ArchDistribution) GetPackageMappingWithVariants(wm deps.WindowManager,
"dms (DankMaterialShell)": a.getDMSMapping(variants["dms (DankMaterialShell)"]), "dms (DankMaterialShell)": a.getDMSMapping(variants["dms (DankMaterialShell)"]),
"git": {Name: "git", Repository: RepoTypeSystem}, "git": {Name: "git", Repository: RepoTypeSystem},
"quickshell": a.getQuickshellMapping(variants["quickshell"]), "quickshell": a.getQuickshellMapping(variants["quickshell"]),
"dms-greeter": a.getDMSGreeterMapping(variants["dms-greeter"]), "dms-greeter": {Name: "greetd-dms-greeter-git", Repository: RepoTypeAUR},
"matugen": a.getMatugenMapping(variants["matugen"]), "matugen": a.getMatugenMapping(variants["matugen"]),
"dgop": {Name: "dgop", Repository: RepoTypeSystem}, "dgop": {Name: "dgop", Repository: RepoTypeSystem},
"ghostty": {Name: "ghostty", Repository: RepoTypeSystem}, "ghostty": {Name: "ghostty", Repository: RepoTypeSystem},
@@ -225,8 +199,6 @@ func (a *ArchDistribution) GetPackageMappingWithVariants(wm deps.WindowManager,
"alacritty": {Name: "alacritty", Repository: RepoTypeSystem}, "alacritty": {Name: "alacritty", Repository: RepoTypeSystem},
"xdg-desktop-portal-gtk": {Name: "xdg-desktop-portal-gtk", Repository: RepoTypeSystem}, "xdg-desktop-portal-gtk": {Name: "xdg-desktop-portal-gtk", Repository: RepoTypeSystem},
"accountsservice": {Name: "accountsservice", Repository: RepoTypeSystem}, "accountsservice": {Name: "accountsservice", Repository: RepoTypeSystem},
"danksearch": a.getDanksearchMapping(variants["danksearch"]),
"dankcalendar": a.getDankCalendarMapping(variants["dankcalendar"]),
} }
switch wm { switch wm {
@@ -281,27 +253,6 @@ func (a *ArchDistribution) getMatugenMapping(variant deps.PackageVariant) Packag
return PackageMapping{Name: "matugen", Repository: RepoTypeSystem} return PackageMapping{Name: "matugen", Repository: RepoTypeSystem}
} }
func (a *ArchDistribution) getDanksearchMapping(variant deps.PackageVariant) PackageMapping {
if variant == deps.VariantGit {
return PackageMapping{Name: "dsearch-git", Repository: RepoTypeAUR}
}
return PackageMapping{Name: "dsearch-bin", Repository: RepoTypeAUR}
}
func (a *ArchDistribution) getDankCalendarMapping(variant deps.PackageVariant) PackageMapping {
if variant == deps.VariantGit {
return PackageMapping{Name: "dankcalendar-git", Repository: RepoTypeAUR}
}
return PackageMapping{Name: "dankcalendar-bin", Repository: RepoTypeAUR}
}
func (a *ArchDistribution) getDMSGreeterMapping(variant deps.PackageVariant) PackageMapping {
if variant == deps.VariantGit {
return PackageMapping{Name: "greetd-dms-greeter-git", Repository: RepoTypeAUR}
}
return PackageMapping{Name: "greetd-dms-greeter-bin", Repository: RepoTypeAUR}
}
func (a *ArchDistribution) getDMSMapping(variant deps.PackageVariant) PackageMapping { func (a *ArchDistribution) getDMSMapping(variant deps.PackageVariant) PackageMapping {
if forceDMSGit || variant == deps.VariantGit { if forceDMSGit || variant == deps.VariantGit {
return PackageMapping{Name: "dms-shell-git", Repository: RepoTypeAUR} return PackageMapping{Name: "dms-shell-git", Repository: RepoTypeAUR}
-8
View File
@@ -107,14 +107,6 @@ func (b *BaseDistribution) detectDgop() deps.Dependency {
return b.detectCommand("dgop", "Desktop portal management tool") return b.detectCommand("dgop", "Desktop portal management tool")
} }
func (b *BaseDistribution) detectDanksearch() deps.Dependency {
return b.detectOptionalPackage("danksearch", "File indexing and search service", b.commandExists("dsearch") || b.commandExists("danksearch"))
}
func (b *BaseDistribution) detectDankCalendar() deps.Dependency {
return b.detectOptionalPackage("dankcalendar", "Calendar application", b.commandExists("dcal") || b.commandExists("dankcalendar"))
}
func (b *BaseDistribution) detectDMS() deps.Dependency { func (b *BaseDistribution) detectDMS() deps.Dependency {
dmsPath := filepath.Join(os.Getenv("HOME"), ".config/quickshell/dms") dmsPath := filepath.Join(os.Getenv("HOME"), ".config/quickshell/dms")
-4
View File
@@ -71,8 +71,6 @@ func (d *DebianDistribution) DetectDependenciesWithTerminal(ctx context.Context,
dependencies = append(dependencies, d.detectMatugen()) dependencies = append(dependencies, d.detectMatugen())
dependencies = append(dependencies, d.detectDgop()) dependencies = append(dependencies, d.detectDgop())
dependencies = append(dependencies, d.detectDanksearch())
dependencies = append(dependencies, d.detectDankCalendar())
return dependencies, nil return dependencies, nil
} }
@@ -137,8 +135,6 @@ func (d *DebianDistribution) GetPackageMappingWithVariants(wm deps.WindowManager
"matugen": {Name: "matugen", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"dgop": {Name: "dgop", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "dgop": {Name: "dgop", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"ghostty": {Name: "ghostty", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "ghostty": {Name: "ghostty", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"danksearch": {Name: "danksearch", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
} }
if wm == deps.WindowManagerNiri { if wm == deps.WindowManagerNiri {
-34
View File
@@ -1,34 +0,0 @@
package distros
import (
"context"
"fmt"
"os/exec"
)
// SetupDsearchService enables the dsearch.service user unit. Enablement failures
// are returned for the caller to surface as a non-fatal warning.
func SetupDsearchService(ctx context.Context, logf func(string)) error {
if logf == nil {
logf = func(string) {}
}
if err := runSystemctlUser(ctx, "daemon-reload"); err != nil {
return err
}
if err := runSystemctlUser(ctx, "enable", "--now", "dsearch.service"); err != nil {
return err
}
logf("Enabled dsearch.service")
return nil
}
func runSystemctlUser(ctx context.Context, args ...string) error {
cmd := exec.CommandContext(ctx, "systemctl", append([]string{"--user"}, args...)...)
if output, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("systemctl --user %v failed: %w: %s", args, err, string(output))
}
return nil
}
-4
View File
@@ -104,8 +104,6 @@ func (f *FedoraDistribution) DetectDependenciesWithTerminal(ctx context.Context,
dependencies = append(dependencies, f.detectMatugen()) dependencies = append(dependencies, f.detectMatugen())
dependencies = append(dependencies, f.detectDgop()) dependencies = append(dependencies, f.detectDgop())
dependencies = append(dependencies, f.detectDanksearch())
dependencies = append(dependencies, f.detectDankCalendar())
return dependencies, nil return dependencies, nil
} }
@@ -140,8 +138,6 @@ func (f *FedoraDistribution) GetPackageMappingWithVariants(wm deps.WindowManager
"matugen": {Name: "matugen", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"},
"dms (DankMaterialShell)": f.getDmsMapping(variants["dms (DankMaterialShell)"]), "dms (DankMaterialShell)": f.getDmsMapping(variants["dms (DankMaterialShell)"]),
"dgop": {Name: "dgop", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"}, "dgop": {Name: "dgop", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"},
"danksearch": {Name: "danksearch", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"},
"dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypeCOPR, RepoURL: "avengemedia/danklinux"},
} }
switch wm { switch wm {
-2
View File
@@ -113,7 +113,6 @@ func (g *GentooDistribution) DetectDependenciesWithTerminal(ctx context.Context,
dependencies = append(dependencies, g.detectMatugen()) dependencies = append(dependencies, g.detectMatugen())
dependencies = append(dependencies, g.detectDgop()) dependencies = append(dependencies, g.detectDgop())
dependencies = append(dependencies, g.detectDanksearch())
return dependencies, nil return dependencies, nil
} }
@@ -172,7 +171,6 @@ func (g *GentooDistribution) GetPackageMappingWithVariants(wm deps.WindowManager
"matugen": {Name: "x11-misc/matugen", Repository: RepoTypeGURU, AcceptKeywords: archKeyword}, "matugen": {Name: "x11-misc/matugen", Repository: RepoTypeGURU, AcceptKeywords: archKeyword},
"dms (DankMaterialShell)": g.getDmsMapping(), "dms (DankMaterialShell)": g.getDmsMapping(),
"dgop": {Name: "gui-apps/dgop", Repository: RepoTypeGURU, AcceptKeywords: archKeyword}, "dgop": {Name: "gui-apps/dgop", Repository: RepoTypeGURU, AcceptKeywords: archKeyword},
"danksearch": {Name: "gui-apps/danksearch", Repository: RepoTypeGURU, AcceptKeywords: archKeyword},
} }
switch wm { switch wm {
-3
View File
@@ -17,7 +17,6 @@ const (
FamilyDebian DistroFamily = "debian" FamilyDebian DistroFamily = "debian"
FamilyNix DistroFamily = "nix" FamilyNix DistroFamily = "nix"
FamilyGentoo DistroFamily = "gentoo" FamilyGentoo DistroFamily = "gentoo"
FamilyVoid DistroFamily = "void"
) )
// PackageManagerType defines the package manager a distro uses // PackageManagerType defines the package manager a distro uses
@@ -30,7 +29,6 @@ const (
PackageManagerZypper PackageManagerType = "zypper" PackageManagerZypper PackageManagerType = "zypper"
PackageManagerNix PackageManagerType = "nix" PackageManagerNix PackageManagerType = "nix"
PackageManagerPortage PackageManagerType = "portage" PackageManagerPortage PackageManagerType = "portage"
PackageManagerXBPS PackageManagerType = "xbps"
) )
// RepositoryType defines the type of repository for a package // RepositoryType defines the type of repository for a package
@@ -44,7 +42,6 @@ const (
RepoTypeOBS RepositoryType = "obs" // OpenBuild Service (Debian/OpenSUSE) RepoTypeOBS RepositoryType = "obs" // OpenBuild Service (Debian/OpenSUSE)
RepoTypeFlake RepositoryType = "flake" // Nix flake RepoTypeFlake RepositoryType = "flake" // Nix flake
RepoTypeGURU RepositoryType = "guru" // Gentoo GURU RepoTypeGURU RepositoryType = "guru" // Gentoo GURU
RepoTypeXBPS RepositoryType = "xbps" // Custom XBPS repository
RepoTypeManual RepositoryType = "manual" // Manual build from source RepoTypeManual RepositoryType = "manual" // Manual build from source
) )
-4
View File
@@ -91,8 +91,6 @@ func (o *OpenSUSEDistribution) DetectDependenciesWithTerminal(ctx context.Contex
dependencies = append(dependencies, o.detectMatugen()) dependencies = append(dependencies, o.detectMatugen())
dependencies = append(dependencies, o.detectDgop()) dependencies = append(dependencies, o.detectDgop())
dependencies = append(dependencies, o.detectDanksearch())
dependencies = append(dependencies, o.detectDankCalendar())
return dependencies, nil return dependencies, nil
} }
@@ -131,8 +129,6 @@ func (o *OpenSUSEDistribution) GetPackageMappingWithVariants(wm deps.WindowManag
"ghostty": {Name: "ghostty", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "ghostty": {Name: "ghostty", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"matugen": {Name: "matugen", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"dgop": {Name: "dgop", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"}, "dgop": {Name: "dgop", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"danksearch": {Name: "danksearch", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
"dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"},
} }
switch wm { switch wm {
-4
View File
@@ -80,8 +80,6 @@ func (u *UbuntuDistribution) DetectDependenciesWithTerminal(ctx context.Context,
dependencies = append(dependencies, u.detectMatugen()) dependencies = append(dependencies, u.detectMatugen())
dependencies = append(dependencies, u.detectDgop()) dependencies = append(dependencies, u.detectDgop())
dependencies = append(dependencies, u.detectDanksearch())
dependencies = append(dependencies, u.detectDankCalendar())
return dependencies, nil return dependencies, nil
} }
@@ -126,8 +124,6 @@ func (u *UbuntuDistribution) GetPackageMappingWithVariants(wm deps.WindowManager
"matugen": {Name: "matugen", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, "matugen": {Name: "matugen", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"},
"dgop": {Name: "dgop", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, "dgop": {Name: "dgop", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"},
"ghostty": {Name: "ghostty", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"}, "ghostty": {Name: "ghostty", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"},
"danksearch": {Name: "danksearch", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"},
"dankcalendar": {Name: "dankcalendar-git", Repository: RepoTypePPA, RepoURL: "ppa:avengemedia/danklinux"},
} }
switch wm { switch wm {
-534
View File
@@ -1,534 +0,0 @@
package distros
import (
"context"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/AvengeMedia/DankMaterialShell/core/internal/deps"
"github.com/AvengeMedia/DankMaterialShell/core/internal/privesc"
)
const (
VoidDMSRepo = "https://avengemedia.github.io/DankMaterialShell/current"
VoidDankLinuxRepo = "https://avengemedia.github.io/DankLinux/current"
VoidHyprlandRepo = "https://mirror.black-hole.dev/x86_64"
voidRunitSvDir = "/etc/sv"
voidRunitServiceDir = "/var/service"
)
func init() {
Register("void", "#478061", FamilyVoid, func(config DistroConfig, logChan chan<- string) Distribution {
return NewVoidDistribution(config, logChan)
})
}
type VoidDistribution struct {
*BaseDistribution
config DistroConfig
}
func NewVoidDistribution(config DistroConfig, logChan chan<- string) *VoidDistribution {
return &VoidDistribution{
BaseDistribution: NewBaseDistribution(logChan),
config: config,
}
}
func (v *VoidDistribution) GetID() string {
return v.config.ID
}
func (v *VoidDistribution) GetColorHex() string {
return v.config.ColorHex
}
func (v *VoidDistribution) GetFamily() DistroFamily {
return v.config.Family
}
func (v *VoidDistribution) GetPackageManager() PackageManagerType {
return PackageManagerXBPS
}
func (v *VoidDistribution) DetectDependencies(ctx context.Context, wm deps.WindowManager) ([]deps.Dependency, error) {
return v.DetectDependenciesWithTerminal(ctx, wm, deps.TerminalGhostty)
}
func (v *VoidDistribution) DetectDependenciesWithTerminal(ctx context.Context, wm deps.WindowManager, terminal deps.Terminal) ([]deps.Dependency, error) {
var dependencies []deps.Dependency
dependencies = append(dependencies, v.detectDMS())
dependencies = append(dependencies, v.detectSpecificTerminal(terminal))
dependencies = append(dependencies, v.detectGit())
dependencies = append(dependencies, v.detectWindowManager(wm))
dependencies = append(dependencies, v.detectQuickshell())
dependencies = append(dependencies, v.detectDMSGreeter())
dependencies = append(dependencies, v.detectXDGPortal())
dependencies = append(dependencies, v.detectAccountsService())
dependencies = append(dependencies, v.detectDBus())
dependencies = append(dependencies, v.detectElogind())
if wm == deps.WindowManagerHyprland {
dependencies = append(dependencies, v.detectHyprlandTools()...)
}
if wm == deps.WindowManagerNiri || wm == deps.WindowManagerMango {
dependencies = append(dependencies, v.detectXwaylandSatellite())
}
dependencies = append(dependencies, v.detectMatugen())
dependencies = append(dependencies, v.detectDgop())
dependencies = append(dependencies, v.detectDanksearch())
dependencies = append(dependencies, v.detectDankCalendar())
return dependencies, nil
}
func (v *VoidDistribution) detectDMS() deps.Dependency {
status := deps.StatusMissing
version := ""
variant := deps.VariantStable
if v.packageInstalled("dms-git") {
status = deps.StatusInstalled
version = v.packageVersion("dms-git")
variant = deps.VariantGit
} else if v.packageInstalled("dms") {
status = deps.StatusInstalled
version = v.packageVersion("dms")
} else if v.commandExists("dms") {
status = deps.StatusInstalled
}
return deps.Dependency{
Name: "dms (DankMaterialShell)",
Status: status,
Version: version,
Description: "Desktop Management System package",
Required: true,
Variant: variant,
CanToggle: true,
}
}
func (v *VoidDistribution) detectQuickshell() deps.Dependency {
dep := v.BaseDistribution.detectQuickshell()
dep.CanToggle = false
return dep
}
func (v *VoidDistribution) detectXDGPortal() deps.Dependency {
return v.detectPackage("xdg-desktop-portal-gtk", "Desktop integration portal for GTK", v.packageInstalled("xdg-desktop-portal-gtk"))
}
func (v *VoidDistribution) detectDMSGreeter() deps.Dependency {
return v.detectOptionalPackage("dms-greeter", "DankMaterialShell greetd greeter", v.packageInstalled("dms-greeter"))
}
func (v *VoidDistribution) detectAccountsService() deps.Dependency {
return v.detectPackage("accountsservice", "D-Bus interface for user account query and manipulation", v.packageInstalled("accountsservice"))
}
func (v *VoidDistribution) detectDBus() deps.Dependency {
return v.detectPackage("dbus", "D-Bus system and session message bus", v.packageInstalled("dbus"))
}
func (v *VoidDistribution) detectElogind() deps.Dependency {
return v.detectPackage("elogind", "loginctl/logind provider for power management and session tracking", v.packageInstalled("elogind") || v.commandExists("loginctl"))
}
func (v *VoidDistribution) detectXwaylandSatellite() deps.Dependency {
return v.detectPackage("xwayland-satellite", "Xwayland support", v.packageInstalled("xwayland-satellite"))
}
func (v *VoidDistribution) packageInstalled(pkg string) bool {
return exec.Command("xbps-query", pkg).Run() == nil
}
func (v *VoidDistribution) packageVersion(pkg string) string {
output, err := exec.Command("xbps-query", "-p", "pkgver", pkg).Output()
if err != nil {
return ""
}
return strings.TrimSpace(string(output))
}
func (v *VoidDistribution) GetPackageMapping(wm deps.WindowManager) map[string]PackageMapping {
return v.GetPackageMappingWithVariants(wm, make(map[string]deps.PackageVariant))
}
func (v *VoidDistribution) GetPackageMappingWithVariants(wm deps.WindowManager, variants map[string]deps.PackageVariant) map[string]PackageMapping {
packages := map[string]PackageMapping{
"git": {Name: "git", Repository: RepoTypeSystem},
"ghostty": {Name: "ghostty", Repository: RepoTypeSystem},
"kitty": {Name: "kitty", Repository: RepoTypeSystem},
"alacritty": {Name: "alacritty", Repository: RepoTypeSystem},
"xdg-desktop-portal-gtk": {Name: "xdg-desktop-portal-gtk", Repository: RepoTypeSystem},
"accountsservice": {Name: "accountsservice", Repository: RepoTypeSystem},
"dbus": {Name: "dbus", Repository: RepoTypeSystem},
"elogind": {Name: "elogind", Repository: RepoTypeSystem},
"quickshell": {Name: "quickshell", Repository: RepoTypeSystem},
"matugen": {Name: "matugen", Repository: RepoTypeSystem},
"dms (DankMaterialShell)": v.getDmsMapping(variants["dms (DankMaterialShell)"]),
"dms-greeter": {Name: "dms-greeter", Repository: RepoTypeXBPS, RepoURL: VoidDMSRepo},
"dgop": {Name: "dgop", Repository: RepoTypeXBPS, RepoURL: VoidDankLinuxRepo},
"danksearch": {Name: "danksearch", Repository: RepoTypeXBPS, RepoURL: VoidDankLinuxRepo},
"dankcalendar": {Name: "dankcalendar", Repository: RepoTypeXBPS, RepoURL: VoidDankLinuxRepo},
}
switch wm {
case deps.WindowManagerHyprland:
packages["hyprland"] = PackageMapping{Name: "hyprland", Repository: RepoTypeXBPS, RepoURL: VoidHyprlandRepo}
packages["hyprctl"] = PackageMapping{Name: "hyprland", Repository: RepoTypeXBPS, RepoURL: VoidHyprlandRepo}
packages["jq"] = PackageMapping{Name: "jq", Repository: RepoTypeSystem}
case deps.WindowManagerNiri:
packages["niri"] = PackageMapping{Name: "niri", Repository: RepoTypeSystem}
packages["xwayland-satellite"] = PackageMapping{Name: "xwayland-satellite", Repository: RepoTypeSystem}
case deps.WindowManagerMango:
packages["mango"] = PackageMapping{Name: "mangowc", Repository: RepoTypeSystem}
packages["xwayland-satellite"] = PackageMapping{Name: "xwayland-satellite", Repository: RepoTypeSystem}
}
return packages
}
func (v *VoidDistribution) getDmsMapping(variant deps.PackageVariant) PackageMapping {
if variant == deps.VariantStable {
return PackageMapping{Name: "dms", Repository: RepoTypeXBPS, RepoURL: VoidDMSRepo}
}
return PackageMapping{Name: "dms-git", Repository: RepoTypeXBPS, RepoURL: VoidDMSRepo}
}
func (v *VoidDistribution) InstallPrerequisites(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error {
progressChan <- InstallProgressMsg{
Phase: PhasePrerequisites,
Progress: 0.06,
Step: "Checking XBPS...",
IsComplete: false,
LogOutput: "Checking for xbps-install",
}
if _, err := exec.LookPath("xbps-install"); err != nil {
return fmt.Errorf("xbps-install not found; Void Linux package tools are required: %w", err)
}
return nil
}
func (v *VoidDistribution) InstallPackages(ctx context.Context, dependencies []deps.Dependency, wm deps.WindowManager, sudoPassword string, reinstallFlags map[string]bool, disabledFlags map[string]bool, skipGlobalUseFlags bool, progressChan chan<- InstallProgressMsg) error {
progressChan <- InstallProgressMsg{
Phase: PhasePrerequisites,
Progress: 0.05,
Step: "Checking system prerequisites...",
IsComplete: false,
LogOutput: "Starting prerequisite check...",
}
if wm == deps.WindowManagerHyprland {
arch, err := v.xbpsArch(ctx)
if err != nil {
return fmt.Errorf("failed to detect XBPS architecture for Hyprland repository selection: %w", err)
}
if arch != "x86_64" {
return fmt.Errorf("hyprland on Void Linux is installed from %s, which currently provides x86_64 packages only (detected %s)", VoidHyprlandRepo, arch)
}
}
if err := v.InstallPrerequisites(ctx, sudoPassword, progressChan); err != nil {
return fmt.Errorf("failed to install prerequisites: %w", err)
}
systemPkgs, xbpsPkgs := v.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags)
if len(xbpsPkgs) > 0 {
progressChan <- InstallProgressMsg{
Phase: PhaseSystemPackages,
Progress: 0.15,
Step: "Enabling DMS XBPS repositories...",
IsComplete: false,
NeedsSudo: true,
LogOutput: "Setting up custom XBPS repositories for DMS packages",
}
if err := v.enableXBPSRepos(ctx, xbpsPkgs, sudoPassword, progressChan); err != nil {
return fmt.Errorf("failed to enable XBPS repositories: %w", err)
}
}
allPkgs := v.uniquePackageNames(systemPkgs, v.extractPackageNames(xbpsPkgs))
if len(allPkgs) > 0 {
progressChan <- InstallProgressMsg{
Phase: PhaseSystemPackages,
Progress: 0.35,
Step: fmt.Sprintf("Installing %d XBPS packages...", len(allPkgs)),
IsComplete: false,
NeedsSudo: true,
LogOutput: fmt.Sprintf("Installing XBPS packages: %s", strings.Join(allPkgs, ", ")),
}
if err := v.installXBPSPackages(ctx, allPkgs, sudoPassword, progressChan); err != nil {
return fmt.Errorf("failed to install XBPS packages: %w", err)
}
}
progressChan <- InstallProgressMsg{
Phase: PhaseConfiguration,
Progress: 0.90,
Step: "Configuring system...",
IsComplete: false,
LogOutput: "Starting post-installation configuration...",
}
v.log("Void Linux detected; DMS environment and autostart will be configured in the compositor config instead of systemd")
if err := v.ensureSessionServices(ctx, sudoPassword, progressChan); err != nil {
return fmt.Errorf("failed to enable Void session services: %w", err)
}
progressChan <- InstallProgressMsg{
Phase: PhaseComplete,
Progress: 1.0,
Step: "Installation complete!",
IsComplete: true,
LogOutput: "All packages installed and configured successfully",
}
return nil
}
func (v *VoidDistribution) ensureSessionServices(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error {
if !v.isRunitSystem() {
v.log("Void runit service directory not detected; skipping dbus/elogind service enablement")
return nil
}
for _, service := range []string{"dbus", "elogind"} {
if !v.runitServiceInstalled(service) {
v.log(fmt.Sprintf("Warning: %s runit service not found in %s; power/session actions may not work until %s is installed", service, voidRunitSvDir, service))
continue
}
if v.runitServiceEnabled(service) {
v.log(fmt.Sprintf("Void runit service %s already enabled", service))
continue
}
progressChan <- InstallProgressMsg{
Phase: PhaseConfiguration,
Progress: 0.92,
Step: fmt.Sprintf("Enabling %s runit service...", service),
IsComplete: false,
NeedsSudo: true,
CommandInfo: fmt.Sprintf("sudo ln -sf %s %s", filepath.Join(voidRunitSvDir, service), filepath.Join(voidRunitServiceDir, service)),
LogOutput: fmt.Sprintf("Enabling Void runit service: %s", service),
}
cmd := privesc.ExecCommand(ctx, sudoPassword, fmt.Sprintf("ln -sf %s %s", filepath.Join(voidRunitSvDir, service), filepath.Join(voidRunitServiceDir, service)))
if err := v.runWithProgress(cmd, progressChan, PhaseConfiguration, 0.92, 0.95); err != nil {
return fmt.Errorf("failed to enable %s runit service: %w", service, err)
}
v.log(fmt.Sprintf("✓ Enabled %s runit service", service))
}
return nil
}
func (v *VoidDistribution) isRunitSystem() bool {
if fi, err := os.Stat("/run/runit"); err == nil && fi.IsDir() {
return true
}
if _, err := os.Stat("/run/systemd/system"); err == nil {
return false
}
if fi, err := os.Stat(voidRunitServiceDir); err == nil && fi.IsDir() {
return true
}
return false
}
func (v *VoidDistribution) runitServiceInstalled(name string) bool {
fi, err := os.Stat(filepath.Join(voidRunitSvDir, name))
return err == nil && fi.IsDir()
}
func (v *VoidDistribution) runitServiceEnabled(name string) bool {
_, err := os.Lstat(filepath.Join(voidRunitServiceDir, name))
return err == nil
}
func (v *VoidDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []PackageMapping) {
systemPkgs := []string{}
xbpsPkgs := []PackageMapping{}
variantMap := make(map[string]deps.PackageVariant)
for _, dep := range dependencies {
variantMap[dep.Name] = dep.Variant
}
packageMap := v.GetPackageMappingWithVariants(wm, variantMap)
for _, dep := range dependencies {
if disabledFlags[dep.Name] {
continue
}
if dep.Status == deps.StatusInstalled && !reinstallFlags[dep.Name] {
continue
}
pkgInfo, exists := packageMap[dep.Name]
if !exists {
v.log(fmt.Sprintf("Warning: No package mapping for %s", dep.Name))
continue
}
switch pkgInfo.Repository {
case RepoTypeXBPS:
xbpsPkgs = append(xbpsPkgs, pkgInfo)
case RepoTypeSystem:
systemPkgs = append(systemPkgs, pkgInfo.Name)
}
}
return systemPkgs, xbpsPkgs
}
func (v *VoidDistribution) enableXBPSRepos(ctx context.Context, xbpsPkgs []PackageMapping, sudoPassword string, progressChan chan<- InstallProgressMsg) error {
enabledRepos := make(map[string]bool)
enabledRepoURLs := []string{}
for _, pkg := range xbpsPkgs {
if pkg.RepoURL == "" || enabledRepos[pkg.RepoURL] {
continue
}
repoName := v.xbpsRepoName(pkg.RepoURL)
confPath := filepath.Join("/etc/xbps.d", repoName+".conf")
repoLine := fmt.Sprintf("repository=%s", pkg.RepoURL)
repoFileContent := repoLine + "\n"
if content, err := os.ReadFile(confPath); err == nil && string(content) == repoFileContent {
v.log(fmt.Sprintf("XBPS repo %s already configured, skipping", pkg.RepoURL))
enabledRepos[pkg.RepoURL] = true
enabledRepoURLs = append(enabledRepoURLs, pkg.RepoURL)
continue
}
progressChan <- InstallProgressMsg{
Phase: PhaseSystemPackages,
Progress: 0.18,
Step: fmt.Sprintf("Adding XBPS repo %s...", repoName),
IsComplete: false,
NeedsSudo: true,
CommandInfo: fmt.Sprintf("echo 'repository=%s' | sudo tee %s", pkg.RepoURL, confPath),
LogOutput: fmt.Sprintf("Adding XBPS repository: %s", pkg.RepoURL),
}
mkdirCmd := privesc.ExecCommand(ctx, sudoPassword, "mkdir -p /etc/xbps.d")
if err := v.runWithProgress(mkdirCmd, progressChan, PhaseSystemPackages, 0.18, 0.19); err != nil {
return fmt.Errorf("failed to create /etc/xbps.d: %w", err)
}
writeCmd := privesc.ExecCommand(ctx, sudoPassword,
fmt.Sprintf("bash -c 'printf \"%%s\\n\" %q > %s'", repoLine, confPath))
if err := v.runWithProgress(writeCmd, progressChan, PhaseSystemPackages, 0.19, 0.22); err != nil {
return fmt.Errorf("failed to add XBPS repo %s: %w", pkg.RepoURL, err)
}
enabledRepos[pkg.RepoURL] = true
enabledRepoURLs = append(enabledRepoURLs, pkg.RepoURL)
}
if len(enabledRepos) > 0 {
syncArgs := []string{"xbps-install", "-Sy", "-i"}
for _, repoURL := range enabledRepoURLs {
syncArgs = append(syncArgs, "--repository", repoURL)
}
syncCommand := strings.Join(syncArgs, " ")
progressChan <- InstallProgressMsg{
Phase: PhaseSystemPackages,
Progress: 0.25,
Step: "Synchronizing XBPS repositories...",
IsComplete: false,
NeedsSudo: true,
CommandInfo: "sudo sh -c 'yes y | " + syncCommand + "'",
LogOutput: "Synchronizing XBPS repository indexes",
}
syncCmd := privesc.ExecCommand(ctx, sudoPassword, "sh -c 'yes y | "+syncCommand+"'")
if err := v.runWithProgress(syncCmd, progressChan, PhaseSystemPackages, 0.25, 0.30); err != nil {
return fmt.Errorf("failed to synchronize XBPS repositories: %w", err)
}
}
return nil
}
func (v *VoidDistribution) xbpsRepoName(repoURL string) string {
switch repoURL {
case VoidDMSRepo:
return "dms"
case VoidDankLinuxRepo:
return "danklinux"
case VoidHyprlandRepo:
return "hyprland"
default:
name := strings.TrimPrefix(repoURL, "https://")
name = strings.TrimPrefix(name, "http://")
name = strings.NewReplacer("/", "-", ".", "-").Replace(name)
return name
}
}
func (v *VoidDistribution) xbpsArch(ctx context.Context) (string, error) {
output, err := exec.CommandContext(ctx, "xbps-uhelper", "arch").Output()
if err != nil {
return "", err
}
return strings.TrimSpace(string(output)), nil
}
func (v *VoidDistribution) installXBPSPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error {
if len(packages) == 0 {
return nil
}
args := append([]string{"xbps-install", "-Sy"}, packages...)
progressChan <- InstallProgressMsg{
Phase: PhaseSystemPackages,
Progress: 0.40,
Step: "Installing XBPS packages...",
IsComplete: false,
NeedsSudo: true,
CommandInfo: fmt.Sprintf("sudo %s", strings.Join(args, " ")),
}
cmd := privesc.ExecCommand(ctx, sudoPassword, strings.Join(args, " "))
return v.runWithProgress(cmd, progressChan, PhaseSystemPackages, 0.40, 0.85)
}
func (v *VoidDistribution) extractPackageNames(packages []PackageMapping) []string {
names := make([]string, len(packages))
for i, pkg := range packages {
names[i] = pkg.Name
}
return names
}
func (v *VoidDistribution) uniquePackageNames(groups ...[]string) []string {
seen := make(map[string]bool)
var unique []string
for _, group := range groups {
for _, pkg := range group {
if pkg == "" || seen[pkg] {
continue
}
seen[pkg] = true
unique = append(unique, pkg)
}
}
return unique
}
+22 -182
View File
@@ -30,11 +30,6 @@ const appArmorProfileDest = "/etc/apparmor.d/usr.bin.dms-greeter"
const GreeterCacheDir = "/var/cache/dms-greeter" const GreeterCacheDir = "/var/cache/dms-greeter"
const (
runitSvDir = "/etc/sv"
runitServiceDir = "/var/service"
)
func DetectDMSPath() (string, error) { func DetectDMSPath() (string, error) {
return config.LocateDMSConfig() return config.LocateDMSConfig()
} }
@@ -46,96 +41,6 @@ func IsNixOS() bool {
return err == nil return err == nil
} }
func IsVoidLinux() bool {
osInfo, err := distros.GetOSInfo()
if err != nil {
return false
}
config, exists := distros.Registry[osInfo.Distribution.ID]
return exists && config.Family == distros.FamilyVoid
}
func isRunit() bool {
if fi, err := os.Stat("/run/runit"); err == nil && fi.IsDir() {
return true
}
if _, err := os.Stat("/run/systemd/system"); err == nil {
return false
}
if fi, err := os.Stat(runitServiceDir); err == nil && fi.IsDir() {
return true
}
return false
}
func runitServiceInstalled(name string) bool {
fi, err := os.Stat(filepath.Join(runitSvDir, name))
return err == nil && fi.IsDir()
}
func runitServiceEnabled(name string) bool {
_, err := os.Lstat(filepath.Join(runitServiceDir, name))
return err == nil
}
func enableRunitService(name, sudoPassword string) error {
if !runitServiceInstalled(name) {
return fmt.Errorf("runit service %q not found in %s", name, runitSvDir)
}
if runitServiceEnabled(name) {
return nil
}
return privesc.Run(context.Background(), sudoPassword, "ln", "-sf",
filepath.Join(runitSvDir, name), filepath.Join(runitServiceDir, name))
}
func disableRunitService(name, sudoPassword string) error {
if !runitServiceEnabled(name) {
return nil
}
return privesc.Run(context.Background(), sudoPassword, "rm", "-f",
filepath.Join(runitServiceDir, name))
}
func ensureRunitSeat(greeterUser, sudoPassword string, logFunc func(string)) {
if runitServiceInstalled("seatd") {
if err := enableRunitService("seatd", sudoPassword); err != nil {
logFunc(fmt.Sprintf("⚠ could not enable seatd: %v", err))
} else {
logFunc("✓ seatd enabled")
}
} else {
logFunc("⚠ seatd not installed — the greeter compositor needs it for GPU/seat access")
}
if err := privesc.Run(context.Background(), sudoPassword, "usermod", "-aG", "_seatd,video,input", greeterUser); err != nil {
logFunc(fmt.Sprintf("⚠ could not add %s to seat groups: %v", greeterUser, err))
} else {
logFunc(fmt.Sprintf("✓ %s added to seat groups (_seatd, video, input)", greeterUser))
}
}
func ensureGreetdPamRundir(sudoPassword string, logFunc func(string)) {
const pamPath = "/etc/pam.d/greetd"
data, err := os.ReadFile(pamPath)
if err != nil {
logFunc(fmt.Sprintf("⚠ could not read %s: %v", pamPath, err))
return
}
if strings.Contains(string(data), "pam_rundir") {
logFunc("✓ pam_rundir already present in greetd PAM")
return
}
line := "session optional pam_rundir.so"
if err := privesc.Run(context.Background(), sudoPassword, "sh", "-c",
fmt.Sprintf("printf '%%s\\n' %q >> %s", line, pamPath)); err != nil {
logFunc(fmt.Sprintf("⚠ could not add pam_rundir to %s: %v", pamPath, err))
return
}
logFunc("✓ pam_rundir added to greetd PAM (provides XDG_RUNTIME_DIR for the session)")
}
func DetectGreeterGroup() string { func DetectGreeterGroup() string {
data, err := os.ReadFile("/etc/group") data, err := os.ReadFile("/etc/group")
if err != nil { if err != nil {
@@ -328,39 +233,24 @@ func stripDesktopExecCodes(execLine string) string {
return strings.Join(cleaned, " ") return strings.Join(cleaned, " ")
} }
func shellQuote(value string) string { func formatInitialSessionCommand(sessionExec string) string {
return "'" + strings.ReplaceAll(value, "'", "'\\''") + "'" execLine := strings.TrimSpace(stripDesktopExecCodes(sessionExec))
} if execLine == "" {
func stableDMSCommand() string {
for _, candidate := range []string{"/usr/bin/dms", "/usr/local/bin/dms"} {
info, err := os.Stat(candidate)
if err == nil && !info.IsDir() && info.Mode()&0o111 != 0 {
return candidate
}
}
return "dms"
}
func formatInitialSessionCommand(cacheDir string) string {
cacheDir = strings.TrimSpace(cacheDir)
if cacheDir == "" {
return `command = ""` return `command = ""`
} }
launcher := fmt.Sprintf("%s greeter launch-session --from-memory --cache-dir %s", stableDMSCommand(), shellQuote(cacheDir)) escaped := strings.ReplaceAll(execLine, `'`, `'\''`)
escaped := strings.ReplaceAll(launcher, `'`, `'\''`)
inner := fmt.Sprintf("env XDG_SESSION_TYPE=wayland sh -c 'exec %s'", escaped) inner := fmt.Sprintf("env XDG_SESSION_TYPE=wayland sh -c 'exec %s'", escaped)
tomlEscaped := strings.ReplaceAll(inner, `\`, `\\`) tomlEscaped := strings.ReplaceAll(inner, `\`, `\\`)
tomlEscaped = strings.ReplaceAll(tomlEscaped, `"`, `\"`) tomlEscaped = strings.ReplaceAll(tomlEscaped, `"`, `\"`)
return fmt.Sprintf(`command = "%s"`, tomlEscaped) return fmt.Sprintf(`command = "%s"`, tomlEscaped)
} }
func upsertInitialSession(configContent, loginUser, cacheDir string, enabled bool) string { func upsertInitialSession(configContent, loginUser, sessionExec string, enabled bool) string {
if !enabled { if !enabled {
return removeTomlSection(configContent, "initial_session") return removeTomlSection(configContent, "initial_session")
} }
commandLine := formatInitialSessionCommand(cacheDir) commandLine := formatInitialSessionCommand(sessionExec)
lines := strings.Split(configContent, "\n") lines := strings.Split(configContent, "\n")
var out []string var out []string
@@ -438,11 +328,10 @@ type greeterAutoLoginConfig struct {
} }
type greeterAutoLoginMemory struct { type greeterAutoLoginMemory struct {
LastSuccessfulUser string `json:"lastSuccessfulUser"` LastSuccessfulUser string `json:"lastSuccessfulUser"`
LastSessionID string `json:"lastSessionId"` LastSessionID string `json:"lastSessionId"`
LastSessionDesktopID string `json:"lastSessionDesktopId"` LastSessionExec string `json:"lastSessionExec"`
LastSessionExec string `json:"lastSessionExec"` AutoLoginEnabled bool `json:"autoLoginEnabled"`
AutoLoginEnabled bool `json:"autoLoginEnabled"`
} }
func readGreeterAutoLoginConfig(settingsPath string) (greeterAutoLoginConfig, error) { func readGreeterAutoLoginConfig(settingsPath string) (greeterAutoLoginConfig, error) {
@@ -492,7 +381,7 @@ func execFromDesktopFile(path string) (string, error) {
return "", fmt.Errorf("no Exec= line found in %s", path) return "", fmt.Errorf("no Exec= line found in %s", path)
} }
func resolveGreeterAutoLoginState(cacheDir, homeDir string) (enabled bool, loginUser string, sessionID string, err error) { func resolveGreeterAutoLoginState(cacheDir, homeDir string) (enabled bool, loginUser string, sessionExec string, err error) {
settingsPath := filepath.Join(cacheDir, "settings.json") settingsPath := filepath.Join(cacheDir, "settings.json")
if _, statErr := os.Stat(settingsPath); statErr != nil { if _, statErr := os.Stat(settingsPath); statErr != nil {
settingsPath = filepath.Join(homeDir, ".config", "DankMaterialShell", "settings.json") settingsPath = filepath.Join(homeDir, ".config", "DankMaterialShell", "settings.json")
@@ -527,9 +416,15 @@ func resolveGreeterAutoLoginState(cacheDir, homeDir string) (enabled bool, login
loginUser = current.Username loginUser = current.Username
} }
sessionID = sessionDesktopIDFromMemory(mem) sessionExec = mem.LastSessionExec
if sessionExec == "" && mem.LastSessionID != "" {
sessionExec, err = execFromDesktopFile(mem.LastSessionID)
if err != nil {
sessionExec = ""
}
}
return true, loginUser, sessionID, nil return true, loginUser, sessionExec, nil
} }
func writeGreetdConfig(configPath, content string, logFunc func(string), sudoPassword, successMsg string) error { func writeGreetdConfig(configPath, content string, logFunc func(string), sudoPassword, successMsg string) error {
@@ -645,7 +540,7 @@ func readGreeterMemoryFile(memoryPath, sudoPassword string) ([]byte, error) {
} }
func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPassword string) error { func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPassword string) error {
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir) enabled, loginUser, sessionExec, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
if err != nil { if err != nil {
return err return err
} }
@@ -673,7 +568,7 @@ func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPas
return writeGreetdConfig(configPath, newConfig, logFunc, sudoPassword, "✓ Disabled greeter auto-login") return writeGreetdConfig(configPath, newConfig, logFunc, sudoPassword, "✓ Disabled greeter auto-login")
} }
if loginUser == "" || sessionID == "" { if loginUser == "" || sessionExec == "" {
if logFunc != nil { if logFunc != nil {
logFunc("⚠ Greeter auto-login is enabled but user or session is not configured yet. Log in manually once, then run sync.") logFunc("⚠ Greeter auto-login is enabled but user or session is not configured yet. Log in manually once, then run sync.")
} }
@@ -684,7 +579,7 @@ func SyncGreetdAutoLogin(cacheDir, homeDir string, logFunc func(string), sudoPas
return nil return nil
} }
newConfig := upsertInitialSession(configContent, loginUser, cacheDir, true) newConfig := upsertInitialSession(configContent, loginUser, sessionExec, true)
if newConfig == configContent { if newConfig == configContent {
if logFunc != nil { if logFunc != nil {
logFunc(fmt.Sprintf("✓ Greeter auto-login already configured for %s", loginUser)) logFunc(fmt.Sprintf("✓ Greeter auto-login already configured for %s", loginUser))
@@ -861,8 +756,6 @@ func EnsureGreetdInstalled(logFunc func(string), sudoPassword string) error {
installCmd = privesc.ExecCommand(ctx, sudoPassword, "apt-get install -y greetd") installCmd = privesc.ExecCommand(ctx, sudoPassword, "apt-get install -y greetd")
case distros.FamilyGentoo: case distros.FamilyGentoo:
installCmd = privesc.ExecCommand(ctx, sudoPassword, "emerge --ask n sys-apps/greetd") installCmd = privesc.ExecCommand(ctx, sudoPassword, "emerge --ask n sys-apps/greetd")
case distros.FamilyVoid:
installCmd = privesc.ExecCommand(ctx, sudoPassword, "xbps-install -Sy greetd")
case distros.FamilyNix: case distros.FamilyNix:
return fmt.Errorf("on NixOS, please add greetd to your configuration.nix") return fmt.Errorf("on NixOS, please add greetd to your configuration.nix")
default: default:
@@ -989,14 +882,6 @@ func TryInstallGreeterPackage(logFunc func(string), sudoPassword string) bool {
} }
failHint = fmt.Sprintf("⚠ dms-greeter install failed. Install from AUR: %s -S greetd-dms-greeter-git", aurHelper) failHint = fmt.Sprintf("⚠ dms-greeter install failed. Install from AUR: %s -S greetd-dms-greeter-git", aurHelper)
installCmd = exec.CommandContext(ctx, aurHelper, "-S", "--noconfirm", "greetd-dms-greeter-git") installCmd = exec.CommandContext(ctx, aurHelper, "-S", "--noconfirm", "greetd-dms-greeter-git")
case distros.FamilyVoid:
failHint = "⚠ dms-greeter install failed. Add the DMS XBPS repo manually:\necho 'repository=https://avengemedia.github.io/DankMaterialShell/current' | sudo tee /etc/xbps.d/dms.conf\nsudo xbps-install -Sy dms-greeter"
logFunc("Adding DMS XBPS repository...")
if err := ensureVoidXBPSRepo(ctx, sudoPassword, "dms", distros.VoidDMSRepo); err != nil {
logFunc(fmt.Sprintf("⚠ Failed to add DMS XBPS repository: %v", err))
}
privesc.ExecCommand(ctx, sudoPassword, "sh -c 'yes y | xbps-install -Sy -i --repository "+distros.VoidDMSRepo+"'").Run()
installCmd = privesc.ExecCommand(ctx, sudoPassword, "xbps-install -Sy dms-greeter")
default: default:
return false return false
} }
@@ -1014,20 +899,6 @@ func TryInstallGreeterPackage(logFunc func(string), sudoPassword string) bool {
return true return true
} }
func ensureVoidXBPSRepo(ctx context.Context, sudoPassword, name, repoURL string) error {
confPath := filepath.Join("/etc/xbps.d", name+".conf")
repoLine := fmt.Sprintf("repository=%s", repoURL)
repoFileContent := repoLine + "\n"
if content, err := os.ReadFile(confPath); err == nil && string(content) == repoFileContent {
return nil
}
if err := privesc.Run(ctx, sudoPassword, "mkdir", "-p", "/etc/xbps.d"); err != nil {
return err
}
return privesc.Run(ctx, sudoPassword, "sh", "-c",
fmt.Sprintf("printf '%%s\\n' %q > %s", repoLine, confPath))
}
// CopyGreeterFiles installs the dms-greeter wrapper and sets up cache directory // CopyGreeterFiles installs the dms-greeter wrapper and sets up cache directory
func CopyGreeterFiles(dmsPath, compositor string, logFunc func(string), sudoPassword string) error { func CopyGreeterFiles(dmsPath, compositor string, logFunc func(string), sudoPassword string) error {
if IsGreeterPackaged() { if IsGreeterPackaged() {
@@ -2394,19 +2265,6 @@ func checkSystemdEnabled(service string) (string, error) {
func DisableConflictingDisplayManagers(sudoPassword string, logFunc func(string)) error { func DisableConflictingDisplayManagers(sudoPassword string, logFunc func(string)) error {
conflictingDMs := []string{"gdm", "gdm3", "lightdm", "sddm", "lxdm", "xdm", "cosmic-greeter"} conflictingDMs := []string{"gdm", "gdm3", "lightdm", "sddm", "lxdm", "xdm", "cosmic-greeter"}
for _, dm := range conflictingDMs { for _, dm := range conflictingDMs {
if isRunit() {
if !runitServiceEnabled(dm) {
continue
}
logFunc(fmt.Sprintf("Disabling conflicting display manager: %s", dm))
if err := disableRunitService(dm, sudoPassword); err != nil {
logFunc(fmt.Sprintf("⚠ Warning: Failed to disable %s: %v", dm, err))
} else {
logFunc(fmt.Sprintf("✓ Disabled %s", dm))
}
continue
}
state, err := checkSystemdEnabled(dm) state, err := checkSystemdEnabled(dm)
if err != nil || state == "" || state == "not-found" { if err != nil || state == "" || state == "not-found" {
continue continue
@@ -2426,19 +2284,6 @@ func DisableConflictingDisplayManagers(sudoPassword string, logFunc func(string)
// EnableGreetd unmasks and enables greetd, forcing it over any other DM. // EnableGreetd unmasks and enables greetd, forcing it over any other DM.
func EnableGreetd(sudoPassword string, logFunc func(string)) error { func EnableGreetd(sudoPassword string, logFunc func(string)) error {
if isRunit() {
if !runitServiceInstalled("greetd") {
return fmt.Errorf("greetd service not found in %s; ensure greetd is installed", runitSvDir)
}
ensureRunitSeat(DetectGreeterUser(), sudoPassword, logFunc)
ensureGreetdPamRundir(sudoPassword, logFunc)
if err := enableRunitService("greetd", sudoPassword); err != nil {
return fmt.Errorf("failed to enable greetd: %w", err)
}
logFunc(fmt.Sprintf("✓ greetd enabled (%s)", runitServiceDir))
return nil
}
state, err := checkSystemdEnabled("greetd") state, err := checkSystemdEnabled("greetd")
if err != nil { if err != nil {
return fmt.Errorf("failed to check greetd state: %w", err) return fmt.Errorf("failed to check greetd state: %w", err)
@@ -2462,11 +2307,6 @@ func EnableGreetd(sudoPassword string, logFunc func(string)) error {
} }
func EnsureGraphicalTarget(sudoPassword string, logFunc func(string)) error { func EnsureGraphicalTarget(sudoPassword string, logFunc func(string)) error {
if isRunit() {
logFunc("✓ runit detected; no graphical target is needed")
return nil
}
cmd := exec.Command("systemctl", "get-default") cmd := exec.Command("systemctl", "get-default")
output, err := cmd.Output() output, err := cmd.Output()
if err != nil { if err != nil {
+13 -70
View File
@@ -111,18 +111,15 @@ command = "/usr/bin/dms-greeter --command niri"
t.Run("inserts initial session", func(t *testing.T) { t.Run("inserts initial session", func(t *testing.T) {
t.Parallel() t.Parallel()
got := upsertInitialSession(baseConfig, "alice", "/var/cache/dms-greeter", true) got := upsertInitialSession(baseConfig, "alice", "niri", true)
if !strings.Contains(got, "[initial_session]") { if !strings.Contains(got, "[initial_session]") {
t.Fatalf("expected [initial_session] section, got:\n%s", got) t.Fatalf("expected [initial_session] section, got:\n%s", got)
} }
if !strings.Contains(got, `user = "alice"`) { if !strings.Contains(got, `user = "alice"`) {
t.Fatalf("expected alice user in initial session, got:\n%s", got) t.Fatalf("expected alice user in initial session, got:\n%s", got)
} }
if !strings.Contains(got, `dms greeter launch-session --from-memory --cache-dir`) { if !strings.Contains(got, `env XDG_SESSION_TYPE=wayland sh -c 'exec niri'`) {
t.Fatalf("expected stable launch-session command, got:\n%s", got) t.Fatalf("expected wrapped session command, got:\n%s", got)
}
if strings.Contains(got, `exec niri`) {
t.Fatalf("initial session must not bake the desktop Exec command, got:\n%s", got)
} }
}) })
@@ -133,12 +130,12 @@ command = "/usr/bin/dms-greeter --command niri"
user = "bob" user = "bob"
command = "old-command" command = "old-command"
` `
got := upsertInitialSession(existing, "alice", "/var/cache/dms-greeter", true) got := upsertInitialSession(existing, "alice", "Hyprland", true)
if strings.Contains(got, `user = "bob"`) { if strings.Contains(got, `user = "bob"`) {
t.Fatalf("expected bob to be replaced, got:\n%s", got) t.Fatalf("expected bob to be replaced, got:\n%s", got)
} }
if !strings.Contains(got, `dms greeter launch-session --from-memory`) { if !strings.Contains(got, `exec Hyprland`) {
t.Fatalf("expected launch-session command, got:\n%s", got) t.Fatalf("expected Hyprland command, got:\n%s", got)
} }
}) })
@@ -182,46 +179,15 @@ func TestResolveGreeterAutoLoginState(t *testing.T) {
}`) }`)
writeTestFile(t, filepath.Join(cacheDir, ".local/state/memory.json"), `{ writeTestFile(t, filepath.Join(cacheDir, ".local/state/memory.json"), `{
"lastSuccessfulUser": "alice", "lastSuccessfulUser": "alice",
"lastSessionDesktopId": "niri.desktop" "lastSessionExec": "niri"
}`) }`)
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir) enabled, loginUser, sessionExec, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
if err != nil { if err != nil {
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err) t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
} }
if !enabled || loginUser != "alice" || sessionID != "niri.desktop" { if !enabled || loginUser != "alice" || sessionExec != "niri" {
t.Fatalf("got enabled=%v user=%q session=%q", enabled, loginUser, sessionID) t.Fatalf("got enabled=%v user=%q exec=%q", enabled, loginUser, sessionExec)
}
}
func TestResolveGreeterAutoLoginStateIgnoresStaleSessionExec(t *testing.T) {
t.Parallel()
cacheDir := t.TempDir()
homeDir := t.TempDir()
writeTestFile(t, filepath.Join(cacheDir, "settings.json"), `{
"greeterAutoLogin": true,
"greeterRememberLastUser": true,
"greeterRememberLastSession": true
}`)
writeTestFile(t, filepath.Join(cacheDir, ".local/state/memory.json"), `{
"lastSuccessfulUser": "alice",
"lastSessionId": "/nix/store/old-session/share/wayland-sessions/example.desktop",
"lastSessionExec": "/nix/store/old-session/bin/start-example-session"
}`)
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
if err != nil {
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
}
if !enabled || loginUser != "alice" || sessionID != "example.desktop" {
t.Fatalf("got enabled=%v user=%q session=%q", enabled, loginUser, sessionID)
}
got := upsertInitialSession("", loginUser, cacheDir, true)
if strings.Contains(got, "/nix/store/old-session") {
t.Fatalf("initial session must not include stale store path, got:\n%s", got)
} }
} }
@@ -242,35 +208,12 @@ func TestResolveGreeterAutoLoginStateIgnoresMemoryFlag(t *testing.T) {
"lastSessionExec": "niri" "lastSessionExec": "niri"
}`) }`)
enabled, loginUser, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir) enabled, loginUser, sessionExec, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
if err != nil { if err != nil {
t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err) t.Fatalf("resolveGreeterAutoLoginState returned error: %v", err)
} }
if enabled || loginUser != "" || sessionID != "" { if enabled || loginUser != "" || sessionExec != "" {
t.Fatalf("expected disabled with empty user/session, got enabled=%v user=%q session=%q", enabled, loginUser, sessionID) t.Fatalf("expected disabled with empty user/exec, got enabled=%v user=%q exec=%q", enabled, loginUser, sessionExec)
}
}
func TestResolveSessionExecInDirs(t *testing.T) {
t.Parallel()
oldDir := filepath.Join(t.TempDir(), "wayland-sessions")
newDir := filepath.Join(t.TempDir(), "wayland-sessions")
writeTestFile(t, filepath.Join(oldDir, "example.desktop"), `[Desktop Entry]
Name=Example Session
Exec=/nix/store/old-session/bin/start-example-session
`)
writeTestFile(t, filepath.Join(newDir, "example.desktop"), `[Desktop Entry]
Name=Example Session
Exec=/run/current-system/sw/bin/start-example-session
`)
got, err := resolveSessionExecInDirs("example.desktop", []string{newDir, oldDir})
if err != nil {
t.Fatalf("resolveSessionExecInDirs returned error: %v", err)
}
if got != "/run/current-system/sw/bin/start-example-session" {
t.Fatalf("resolveSessionExecInDirs = %q", got)
} }
} }
-122
View File
@@ -1,122 +0,0 @@
package greeter
import (
"fmt"
"os"
"path/filepath"
"strings"
"syscall"
)
func sessionDesktopIDFromPath(path string) string {
id := strings.TrimSpace(path)
if id == "" {
return ""
}
if strings.ContainsAny(id, "/\\") {
id = filepath.Base(id)
}
if id == "" {
return ""
}
if !strings.HasSuffix(id, ".desktop") {
id += ".desktop"
}
return id
}
func sessionDesktopIDFromMemory(mem greeterAutoLoginMemory) string {
if id := sessionDesktopIDFromPath(mem.LastSessionDesktopID); id != "" {
return id
}
return sessionDesktopIDFromPath(mem.LastSessionID)
}
func sessionDesktopDirs() []string {
seen := make(map[string]bool)
dirs := make([]string, 0, 8)
addBase := func(base string) {
base = strings.TrimSpace(base)
if base == "" {
return
}
for _, sub := range []string{"wayland-sessions", "xsessions"} {
dir := filepath.Join(base, sub)
if seen[dir] {
continue
}
seen[dir] = true
dirs = append(dirs, dir)
}
}
if dataHome := os.Getenv("XDG_DATA_HOME"); dataHome != "" {
addBase(dataHome)
} else if home, err := os.UserHomeDir(); err == nil && home != "" {
addBase(filepath.Join(home, ".local", "share"))
}
if dataDirs := os.Getenv("XDG_DATA_DIRS"); dataDirs != "" {
for _, dir := range strings.Split(dataDirs, ":") {
addBase(dir)
}
} else {
addBase("/usr/local/share")
addBase("/usr/share")
}
return dirs
}
func ResolveSessionExec(sessionID string) (string, error) {
return resolveSessionExecInDirs(sessionID, sessionDesktopDirs())
}
func resolveSessionExecInDirs(sessionID string, dirs []string) (string, error) {
id := sessionDesktopIDFromPath(sessionID)
if id == "" {
return "", fmt.Errorf("session id is empty")
}
for _, dir := range dirs {
path := filepath.Join(dir, id)
execLine, err := execFromDesktopFile(path)
if err == nil {
return execLine, nil
}
if !os.IsNotExist(err) {
return "", err
}
}
return "", fmt.Errorf("session desktop file %q was not found", id)
}
func LaunchSessionByID(sessionID string) error {
execLine, err := ResolveSessionExec(sessionID)
if err != nil {
return err
}
execLine = strings.TrimSpace(stripDesktopExecCodes(execLine))
if execLine == "" {
return fmt.Errorf("session %q has an empty Exec command", sessionID)
}
env := append(os.Environ(), "XDG_SESSION_TYPE=wayland")
return syscall.Exec("/bin/sh", []string{"sh", "-c", "exec " + execLine}, env)
}
func LaunchSessionFromMemory(cacheDir, homeDir string) error {
enabled, _, sessionID, err := resolveGreeterAutoLoginState(cacheDir, homeDir)
if err != nil {
return err
}
if !enabled {
return fmt.Errorf("greeter auto-login is disabled")
}
if sessionID == "" {
return fmt.Errorf("greeter auto-login has no remembered session")
}
return LaunchSessionByID(sessionID)
}
+7 -40
View File
@@ -41,8 +41,6 @@ type Config struct {
ReplaceConfigs []string // specific configs to deploy (e.g. "niri", "ghostty") ReplaceConfigs []string // specific configs to deploy (e.g. "niri", "ghostty")
ReplaceConfigsAll bool // deploy/replace all configurations ReplaceConfigsAll bool // deploy/replace all configurations
Yes bool Yes bool
DankSearch bool // install danksearch and enable its user service
DankCalendar bool // install dankcalendar
} }
// Runner orchestrates unattended (headless) installation. // Runner orchestrates unattended (headless) installation.
@@ -216,11 +214,6 @@ func (r *Runner) Run() error {
return fmt.Errorf("package installation failed: %w", err) return fmt.Errorf("package installation failed: %w", err)
} }
useSystemd := true
if distroConfig, exists := distros.Registry[osInfo.Distribution.ID]; exists && distroConfig.Family == distros.FamilyVoid {
useSystemd = false
}
// 9. Greeter setup (if dms-greeter was included) // 9. Greeter setup (if dms-greeter was included)
if !disabledItems["dms-greeter"] && r.depExists(dependencies, "dms-greeter") { if !disabledItems["dms-greeter"] && r.depExists(dependencies, "dms-greeter") {
compositorName := "niri" compositorName := "niri"
@@ -238,32 +231,18 @@ func (r *Runner) Run() error {
} }
} }
// 9b. danksearch service setup (if danksearch was included)
if useSystemd && !disabledItems["danksearch"] && r.depExists(dependencies, "danksearch") {
fmt.Fprintln(os.Stdout, "Enabling danksearch service...")
logFunc := func(line string) {
r.log(line)
fmt.Fprintf(os.Stdout, " danksearch: %s\n", line)
}
if err := distros.SetupDsearchService(context.Background(), logFunc); err != nil {
// Non-fatal, matching greeter behavior
fmt.Fprintf(os.Stderr, "Warning: danksearch service setup issue (non-fatal): %v\n", err)
}
}
// 10. Deploy configurations // 10. Deploy configurations
fmt.Fprintln(os.Stdout, "Deploying configurations...") fmt.Fprintln(os.Stdout, "Deploying configurations...")
r.log("Starting configuration deployment") r.log("Starting configuration deployment")
deployer := config.NewConfigDeployer(r.logChan) deployer := config.NewConfigDeployer(r.logChan)
results, err := deployer.DeployConfigurationsSelectiveWithReinstallsAndSystemd( results, err := deployer.DeployConfigurationsSelectiveWithReinstalls(
context.Background(), context.Background(),
wm, wm,
terminal, terminal,
dependencies, dependencies,
replaceConfigs, replaceConfigs,
reinstallItems, reinstallItems,
useSystemd,
) )
if err != nil { if err != nil {
return fmt.Errorf("configuration deployment failed: %w", err) return fmt.Errorf("configuration deployment failed: %w", err)
@@ -288,31 +267,19 @@ func (r *Runner) Run() error {
} }
// buildDisabledItems computes the set of dependencies that should be skipped // buildDisabledItems computes the set of dependencies that should be skipped
// during installation. Optional components are opt-in (disabled by default), // during installation, applying the --include-deps and --exclude-deps filters.
// then re-enabled by the dedicated flags and --include-deps. // dms-greeter is disabled by default (opt-in), matching TUI behavior.
func (r *Runner) buildDisabledItems(dependencies []deps.Dependency) (map[string]bool, error) { func (r *Runner) buildDisabledItems(dependencies []deps.Dependency) (map[string]bool, error) {
disabledItems := make(map[string]bool) disabledItems := make(map[string]bool)
// dms-greeter is opt-in (disabled by default), matching TUI behavior
for i := range dependencies { for i := range dependencies {
if !dependencies[i].Required { if dependencies[i].Name == "dms-greeter" {
disabledItems[dependencies[i].Name] = true disabledItems["dms-greeter"] = true
break
} }
} }
// Dedicated flags resolve before include/exclude
if r.cfg.DankSearch {
if !r.depExists(dependencies, "danksearch") {
return nil, fmt.Errorf("--danksearch: not available on this distribution")
}
delete(disabledItems, "danksearch")
}
if r.cfg.DankCalendar {
if !r.depExists(dependencies, "dankcalendar") {
return nil, fmt.Errorf("--dankcalendar: not available on this distribution")
}
delete(disabledItems, "dankcalendar")
}
// Process --include-deps (enable items that are disabled by default) // Process --include-deps (enable items that are disabled by default)
for _, name := range r.cfg.IncludeDeps { for _, name := range r.cfg.IncludeDeps {
name = strings.TrimSpace(name) name = strings.TrimSpace(name)
+17 -51
View File
@@ -342,21 +342,17 @@ func TestConfigReplaceConfigsStoredCorrectly(t *testing.T) {
func TestBuildDisabledItems(t *testing.T) { func TestBuildDisabledItems(t *testing.T) {
dependencies := []deps.Dependency{ dependencies := []deps.Dependency{
{Name: "niri", Status: deps.StatusInstalled, Required: true}, {Name: "niri", Status: deps.StatusInstalled},
{Name: "ghostty", Status: deps.StatusMissing, Required: true}, {Name: "ghostty", Status: deps.StatusMissing},
{Name: "dms (DankMaterialShell)", Status: deps.StatusInstalled, Required: true}, {Name: "dms (DankMaterialShell)", Status: deps.StatusInstalled},
{Name: "dms-greeter", Status: deps.StatusMissing}, {Name: "dms-greeter", Status: deps.StatusMissing},
{Name: "danksearch", Status: deps.StatusMissing}, {Name: "waybar", Status: deps.StatusMissing},
{Name: "dankcalendar", Status: deps.StatusMissing},
{Name: "waybar", Status: deps.StatusMissing, Required: true},
} }
tests := []struct { tests := []struct {
name string name string
includeDeps []string includeDeps []string
excludeDeps []string excludeDeps []string
dankSearch bool
dankCalendar bool
deps []deps.Dependency // nil means use the shared fixture deps []deps.Dependency // nil means use the shared fixture
wantErr bool wantErr bool
errContains string // substring expected in error message errContains string // substring expected in error message
@@ -364,20 +360,19 @@ func TestBuildDisabledItems(t *testing.T) {
wantEnabled []string // dep names that should NOT be in disabledItems (extra check) wantEnabled []string // dep names that should NOT be in disabledItems (extra check)
}{ }{
{ {
name: "no flags set, optional deps disabled by default", name: "no flags set, dms-greeter disabled by default",
wantDisabled: []string{"dms-greeter", "danksearch", "dankcalendar"}, wantDisabled: []string{"dms-greeter"},
wantEnabled: []string{"niri", "ghostty", "waybar"}, wantEnabled: []string{"niri", "ghostty", "waybar"},
}, },
{ {
name: "include dms-greeter enables it", name: "include dms-greeter enables it",
includeDeps: []string{"dms-greeter"}, includeDeps: []string{"dms-greeter"},
wantEnabled: []string{"dms-greeter"}, wantEnabled: []string{"dms-greeter"},
wantDisabled: []string{"danksearch", "dankcalendar"},
}, },
{ {
name: "exclude a regular dep", name: "exclude a regular dep",
excludeDeps: []string{"waybar"}, excludeDeps: []string{"waybar"},
wantDisabled: []string{"dms-greeter", "danksearch", "dankcalendar", "waybar"}, wantDisabled: []string{"dms-greeter", "waybar"},
}, },
{ {
name: "include unknown dep returns error", name: "include unknown dep returns error",
@@ -404,53 +399,24 @@ func TestBuildDisabledItems(t *testing.T) {
wantDisabled: []string{"dms-greeter"}, wantDisabled: []string{"dms-greeter"},
}, },
{ {
name: "whitespace entries are skipped", name: "whitespace entries are skipped",
includeDeps: []string{" ", "dms-greeter"}, includeDeps: []string{" ", "dms-greeter"},
wantEnabled: []string{"dms-greeter"}, wantEnabled: []string{"dms-greeter"},
wantDisabled: []string{"danksearch", "dankcalendar"},
}, },
{ {
name: "no optional deps present, nothing disabled by default", name: "no dms-greeter in deps, nothing disabled by default",
deps: []deps.Dependency{ deps: []deps.Dependency{
{Name: "niri", Status: deps.StatusInstalled, Required: true}, {Name: "niri", Status: deps.StatusInstalled},
}, },
wantEnabled: []string{"niri"}, wantEnabled: []string{"niri"},
}, },
{
name: "danksearch flag enables it",
dankSearch: true,
wantEnabled: []string{"danksearch"},
wantDisabled: []string{"dms-greeter", "dankcalendar"},
},
{
name: "dankcalendar flag enables it",
dankCalendar: true,
wantEnabled: []string{"dankcalendar"},
wantDisabled: []string{"dms-greeter", "danksearch"},
},
{
name: "danksearch flag when unavailable errors",
dankSearch: true,
deps: []deps.Dependency{{Name: "niri", Status: deps.StatusInstalled, Required: true}},
wantErr: true,
errContains: "--danksearch",
},
{
name: "dankcalendar flag when unavailable errors",
dankCalendar: true,
deps: []deps.Dependency{{Name: "niri", Status: deps.StatusInstalled, Required: true}},
wantErr: true,
errContains: "--dankcalendar",
},
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
r := NewRunner(Config{ r := NewRunner(Config{
IncludeDeps: tt.includeDeps, IncludeDeps: tt.includeDeps,
ExcludeDeps: tt.excludeDeps, ExcludeDeps: tt.excludeDeps,
DankSearch: tt.dankSearch,
DankCalendar: tt.dankCalendar,
}) })
d := tt.deps d := tt.deps
if d == nil { if d == nil {
+2 -14
View File
@@ -190,13 +190,9 @@ func (h *HyprlandProvider) formatRawAction(dispatcher, params string) string {
} }
func (h *HyprlandProvider) formatKey(kb *HyprlandKeyBinding) string { func (h *HyprlandProvider) formatKey(kb *HyprlandKeyBinding) string {
key := kb.Key
if canonical, ok := hyprlandScrollToCanonical(key); ok {
key = canonical
}
parts := make([]string, 0, len(kb.Mods)+1) parts := make([]string, 0, len(kb.Mods)+1)
parts = append(parts, kb.Mods...) parts = append(parts, kb.Mods...)
parts = append(parts, key) parts = append(parts, kb.Key)
return strings.Join(parts, "+") return strings.Join(parts, "+")
} }
@@ -415,9 +411,6 @@ func normalizeLuaBindKeyPart(part string) string {
case "alt", "mod1": case "alt", "mod1":
return "ALT" return "ALT"
} }
if native, ok := hyprlandScrollToNative(part); ok {
return native
}
if len(part) == 1 { if len(part) == 1 {
return strings.ToUpper(part) return strings.ToUpper(part)
} }
@@ -1137,11 +1130,6 @@ func parseLuaUnbindLine(line string) (string, bool) {
func luaKeyComboToInternalKey(combo string) string { func luaKeyComboToInternalKey(combo string) string {
parts := strings.Fields(strings.ReplaceAll(strings.ReplaceAll(combo, "+", " "), " ", " ")) parts := strings.Fields(strings.ReplaceAll(strings.ReplaceAll(combo, "+", " "), " ", " "))
for i, part := range parts {
if canonical, ok := hyprlandScrollToCanonical(part); ok {
parts[i] = canonical
}
}
return strings.Join(parts, "+") return strings.Join(parts, "+")
} }
@@ -1154,7 +1142,7 @@ func readLuaOrHyprlangOverride(path string) (map[string]*hyprlandOverrideBind, e
if err != nil { if err != nil {
return nil, err return nil, err
} }
lines := expandLuaConfigLines(strings.Split(string(data), "\n")) lines := strings.Split(string(data), "\n")
parser := NewHyprlandParser("") parser := NewHyprlandParser("")
pendingUnbinds := make(map[string]string) pendingUnbinds := make(map[string]string)
for _, line := range lines { for _, line := range lines {
@@ -1,414 +0,0 @@
package providers
import (
"maps"
"regexp"
"strconv"
"strings"
)
// Lua configs can express binds dynamically: variables (mainMod .. " + C"),
// tostring() calls, and numeric for loops (workspace binds). This resolves such
// expressions to literal key combos so the static bind parser can read them.
const luaMaxLoopIterations = 1000
var (
luaAssignRE = regexp.MustCompile(`^(?:local\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.+)$`)
luaForRE = regexp.MustCompile(`^for\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(-?\d+)\s*,\s*(-?\d+)\s*(?:,\s*(-?\d+)\s*)?do\b(.*)$`)
luaTostringRE = regexp.MustCompile(`to(?:string|number)\s*\(\s*("(?:\\.|[^"])*"|'(?:\\.|[^'])*'|-?\d+(?:\.\d+)?)\s*\)`)
luaBlockOpenRE = regexp.MustCompile(`\b(?:function|for|while|if)\b`)
luaBlockCloseRE = regexp.MustCompile(`\bend\b`)
luaNumberRE = regexp.MustCompile(`^-?\d+(?:\.\d+)?$`)
)
type luaVarEnv map[string]string
type luaForHeader struct {
varName string
start int
stop int
step int
inline string
}
func expandLuaConfigLines(lines []string) []string {
return expandLuaBlock(lines, luaVarEnv{})
}
func expandLuaBlock(lines []string, env luaVarEnv) []string {
out := make([]string, 0, len(lines))
for i := 0; i < len(lines); i++ {
code := strings.TrimSpace(luaStripLineComment(lines[i]))
if name, value, ok := parseLuaStringAssignment(code, env); ok {
env[name] = value
out = append(out, lines[i])
continue
}
header, ok := parseLuaForHeader(code)
if !ok {
out = append(out, resolveLuaDynamicLine(lines[i], env))
continue
}
body, consumed, complete := collectLuaForBody(header, lines, i)
if !complete {
out = append(out, resolveLuaDynamicLine(lines[i], env))
continue
}
out = append(out, expandLuaForLoop(header, body, env)...)
i = consumed
}
return out
}
func parseLuaStringAssignment(code string, env luaVarEnv) (name, value string, ok bool) {
m := luaAssignRE.FindStringSubmatch(code)
if m == nil {
return "", "", false
}
value, ok = evalLuaConcat(m[2], env)
if !ok {
return "", "", false
}
return m[1], value, true
}
func parseLuaForHeader(code string) (luaForHeader, bool) {
m := luaForRE.FindStringSubmatch(code)
if m == nil {
return luaForHeader{}, false
}
start, _ := strconv.Atoi(m[2])
stop, _ := strconv.Atoi(m[3])
step := 1
if m[4] != "" {
step, _ = strconv.Atoi(m[4])
}
if step == 0 {
return luaForHeader{}, false
}
return luaForHeader{varName: m[1], start: start, stop: stop, step: step, inline: strings.TrimSpace(m[5])}, true
}
func collectLuaForBody(header luaForHeader, lines []string, headerIdx int) (body []string, consumed int, complete bool) {
depth := 1
if header.inline != "" {
delta := luaBlockDelta(header.inline)
if depth+delta <= 0 {
if stmt := strings.TrimSpace(strings.TrimSuffix(strings.TrimSpace(header.inline), "end")); stmt != "" {
body = append(body, stmt)
}
return body, headerIdx, true
}
depth += delta
body = append(body, header.inline)
}
for j := headerIdx + 1; j < len(lines); j++ {
delta := luaBlockDelta(lines[j])
if depth+delta <= 0 {
return body, j, true
}
depth += delta
body = append(body, lines[j])
}
return nil, headerIdx, false
}
func expandLuaForLoop(header luaForHeader, body []string, env luaVarEnv) []string {
var out []string
inRange := func(v int) bool {
if header.step > 0 {
return v <= header.stop
}
return v >= header.stop
}
count := 0
for v := header.start; inRange(v); v += header.step {
if count++; count > luaMaxLoopIterations {
break
}
value := strconv.Itoa(v)
iterLines := make([]string, len(body))
for k, bl := range body {
iterLines[k] = substituteLuaIdent(bl, header.varName, value)
}
out = append(out, expandLuaBlock(iterLines, cloneLuaEnv(env))...)
}
return out
}
func luaBlockDelta(line string) int {
masked := luaMaskStrings(line)
return len(luaBlockOpenRE.FindAllString(masked, -1)) - len(luaBlockCloseRE.FindAllString(masked, -1))
}
func resolveLuaDynamicLine(line string, env luaVarEnv) string {
if !strings.Contains(line, "hl.bind") && !strings.Contains(line, "hl.unbind") {
return line
}
line = normalizeLuaToString(line)
return rewriteLuaBindKeyArg(line, env)
}
func normalizeLuaToString(line string) string {
return luaTostringRE.ReplaceAllStringFunc(line, func(m string) string {
inner := luaTostringRE.FindStringSubmatch(m)[1]
if inner[0] == '"' || inner[0] == '\'' {
return inner
}
return strconv.Quote(inner)
})
}
func rewriteLuaBindKeyArg(line string, env luaVarEnv) string {
for _, fn := range []string{"hl.bind", "hl.unbind"} {
idx := strings.Index(line, fn)
if idx < 0 {
continue
}
open := skipLuaWS(line, idx+len(fn))
if open >= len(line) || line[open] != '(' {
continue
}
argStart := skipLuaWS(line, open+1)
expr, end, ok := parseLuaFirstArgExpr(line, argStart)
if !ok || isLuaPlainStringArg(expr) {
continue
}
value, ok := evalLuaConcat(expr, env)
if !ok {
continue
}
return line[:argStart] + strconv.Quote(value) + line[end:]
}
return line
}
func evalLuaConcat(expr string, env luaVarEnv) (string, bool) {
parts := splitLuaConcat(expr)
var sb strings.Builder
for _, part := range parts {
value, ok := evalLuaOperand(part, env)
if !ok {
return "", false
}
sb.WriteString(value)
}
return sb.String(), true
}
func evalLuaOperand(op string, env luaVarEnv) (string, bool) {
op = strings.TrimSpace(op)
if op == "" {
return "", false
}
switch op[0] {
case '"', '\'':
s, next, ok := parseLuaStringLiteral(op, 0)
return s, next == len(op) && ok
}
if luaNumberRE.MatchString(op) {
return op, true
}
if inner, ok := luaUnwrapCall(op, "tostring"); ok {
return evalLuaConcat(inner, env)
}
if inner, ok := luaUnwrapCall(op, "tonumber"); ok {
return evalLuaConcat(inner, env)
}
if value, ok := env[op]; ok {
return value, true
}
return "", false
}
func splitLuaConcat(expr string) []string {
var parts []string
parenDepth, braceDepth, bracketDepth := 0, 0, 0
inStr := byte(0)
esc := false
start := 0
for i := 0; i < len(expr); i++ {
c := expr[i]
if inStr != 0 {
switch {
case esc:
esc = false
case c == '\\' && inStr == '"':
esc = true
case c == inStr:
inStr = 0
}
continue
}
switch c {
case '"', '\'':
inStr = c
case '(':
parenDepth++
case ')':
if parenDepth > 0 {
parenDepth--
}
case '{':
braceDepth++
case '}':
if braceDepth > 0 {
braceDepth--
}
case '[':
bracketDepth++
case ']':
if bracketDepth > 0 {
bracketDepth--
}
case '.':
if parenDepth == 0 && braceDepth == 0 && bracketDepth == 0 && i+1 < len(expr) && expr[i+1] == '.' {
parts = append(parts, expr[start:i])
i++
start = i + 1
}
}
}
return append(parts, expr[start:])
}
func substituteLuaIdent(line, name, value string) string {
if !strings.Contains(line, name) {
return line
}
var sb strings.Builder
inStr := byte(0)
esc := false
for i := 0; i < len(line); {
c := line[i]
if inStr != 0 {
sb.WriteByte(c)
switch {
case esc:
esc = false
case c == '\\' && inStr == '"':
esc = true
case c == inStr:
inStr = 0
}
i++
continue
}
if c == '"' || c == '\'' {
inStr = c
sb.WriteByte(c)
i++
continue
}
if isLuaIdentStart(c) {
j := i + 1
for j < len(line) && isLuaIdentByte(line[j]) {
j++
}
word := line[i:j]
if word == name && (i == 0 || line[i-1] != '.') {
sb.WriteString(value)
} else {
sb.WriteString(word)
}
i = j
continue
}
sb.WriteByte(c)
i++
}
return sb.String()
}
func luaMaskStrings(line string) string {
b := []byte(line)
inStr := byte(0)
esc := false
for i := 0; i < len(b); i++ {
c := b[i]
if inStr != 0 {
wasEnd := !esc && c == inStr
esc = !esc && c == '\\' && inStr == '"'
b[i] = ' '
if wasEnd {
inStr = 0
}
continue
}
switch c {
case '"', '\'':
inStr = c
b[i] = ' '
case '-':
if i+1 < len(b) && b[i+1] == '-' {
for ; i < len(b); i++ {
b[i] = ' '
}
}
}
}
return string(b)
}
func luaStripLineComment(line string) string {
inStr := byte(0)
esc := false
for i := 0; i+1 < len(line); i++ {
c := line[i]
if inStr != 0 {
switch {
case esc:
esc = false
case c == '\\' && inStr == '"':
esc = true
case c == inStr:
inStr = 0
}
continue
}
switch c {
case '"', '\'':
inStr = c
case '-':
if line[i+1] == '-' {
return line[:i]
}
}
}
return line
}
func luaUnwrapCall(op, fn string) (string, bool) {
op = strings.TrimSpace(op)
if !strings.HasPrefix(op, fn) {
return "", false
}
rest := strings.TrimSpace(op[len(fn):])
if !strings.HasPrefix(rest, "(") || !strings.HasSuffix(rest, ")") {
return "", false
}
return rest[1 : len(rest)-1], true
}
func isLuaPlainStringArg(expr string) bool {
expr = strings.TrimSpace(expr)
if expr == "" || (expr[0] != '"' && expr[0] != '\'') {
return false
}
_, next, ok := parseLuaStringLiteral(expr, 0)
return ok && next == len(expr)
}
func isLuaIdentStart(c byte) bool {
return c == '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
}
func cloneLuaEnv(env luaVarEnv) luaVarEnv {
clone := make(luaVarEnv, len(env))
maps.Copy(clone, env)
return clone
}
@@ -1,134 +0,0 @@
package providers
import (
"strings"
"testing"
)
func TestExpandLuaConfigLinesVariableConcat(t *testing.T) {
lines := []string{
`local mainMod = "SUPER"`,
`hl.bind(mainMod .. " + C", hl.dsp.window.close())`,
`hl.bind(mainMod .. " + H", hl.dsp.focus({direction = "l"}))`,
`hl.bind("ALT + TAB", hl.dsp.window.cycle_next({}))`,
}
got := expandLuaConfigLines(lines)
want := []string{
`hl.bind("SUPER + C",`,
`hl.bind("SUPER + H",`,
`hl.bind("ALT + TAB",`,
}
joined := strings.Join(got, "\n")
for _, w := range want {
if !strings.Contains(joined, w) {
t.Errorf("expanded output missing %q\n---\n%s", w, joined)
}
}
}
func TestExpandLuaConfigLinesForLoop(t *testing.T) {
lines := []string{
`local mainMod = "SUPER"`,
`for i = 1, 3 do`,
` hl.bind(mainMod .. " + " .. i, hl.dsp.focus({workspace = tostring(i)}))`,
` hl.bind(mainMod .. " SHIFT + " .. i, hl.dsp.window.move({workspace = tostring(i)}))`,
`end`,
}
got := strings.Join(expandLuaConfigLines(lines), "\n")
for _, w := range []string{
`hl.bind("SUPER + 1",`,
`hl.bind("SUPER + 2",`,
`hl.bind("SUPER + 3",`,
`hl.bind("SUPER SHIFT + 3",`,
`{workspace = "1"}`,
} {
if !strings.Contains(got, w) {
t.Errorf("expanded loop missing %q\n---\n%s", w, got)
}
}
}
func TestParseLuaLinesDynamicBinds(t *testing.T) {
content := strings.Join([]string{
`local mainMod = "SUPER"`,
`hl.bind(mainMod .. " + C", hl.dsp.window.close())`,
`hl.bind("ALT + TAB", hl.dsp.window.cycle_next({}))`,
`for i = 1, 2 do`,
` hl.bind(mainMod .. " + " .. i, hl.dsp.focus({workspace = tostring(i)}))`,
`end`,
}, "\n")
parser := NewHyprlandParser("")
section, err := parser.parseLuaLines(content, "", "test.lua", "")
if err != nil {
t.Fatalf("parseLuaLines: %v", err)
}
keys := map[string]*HyprlandKeyBinding{}
for i := range section.Keybinds {
kb := &section.Keybinds[i]
keys[parser.formatBindKey(kb)] = kb
}
for _, want := range []string{"SUPER+C", "ALT+TAB", "SUPER+1", "SUPER+2"} {
if _, ok := keys[want]; !ok {
t.Errorf("missing bind %q; got %v", want, keysList(keys))
}
}
if kb := keys["SUPER+C"]; kb != nil && kb.Dispatcher != "killactive" {
t.Errorf("SUPER+C dispatcher = %q, want killactive", kb.Dispatcher)
}
if kb := keys["SUPER+1"]; kb != nil {
if kb.Dispatcher != "workspace" || kb.Params != "1" {
t.Errorf("SUPER+1 = %q %q, want workspace 1", kb.Dispatcher, kb.Params)
}
}
}
func keysList(m map[string]*HyprlandKeyBinding) []string {
out := make([]string, 0, len(m))
for k := range m {
out = append(out, k)
}
return out
}
func TestEvalLuaConcat(t *testing.T) {
env := luaVarEnv{"mainMod": "SUPER", "i": "5"}
tests := []struct {
expr string
want string
ok bool
}{
{`mainMod .. " + C"`, "SUPER + C", true},
{`mainMod .. " + " .. i`, "SUPER + 5", true},
{`mainMod .. " + " .. tostring(i)`, "SUPER + 5", true},
{`"ALT + TAB"`, "ALT + TAB", true},
{`mainMod .. someFunc()`, "", false},
{`unknownVar .. "x"`, "", false},
}
for _, tt := range tests {
got, ok := evalLuaConcat(tt.expr, env)
if ok != tt.ok || (ok && got != tt.want) {
t.Errorf("evalLuaConcat(%q) = %q,%v want %q,%v", tt.expr, got, ok, tt.want, tt.ok)
}
}
}
func TestSubstituteLuaIdent(t *testing.T) {
tests := []struct {
line, name, value, want string
}{
{`hl.bind(m .. " + " .. i, x)`, "i", "3", `hl.bind(m .. " + " .. 3, x)`},
{`hl.dsp.exec("light -i")`, "i", "3", `hl.dsp.exec("light -i")`},
{`foo.i`, "i", "3", `foo.i`},
{`tostring(i)`, "i", "3", `tostring(3)`},
}
for _, tt := range tests {
if got := substituteLuaIdent(tt.line, tt.name, tt.value); got != tt.want {
t.Errorf("substituteLuaIdent(%q,%q,%q) = %q, want %q", tt.line, tt.name, tt.value, got, tt.want)
}
}
}
@@ -347,13 +347,9 @@ func (p *HyprlandParser) buildDMSStatus() *HyprlandDMSStatus {
} }
func (p *HyprlandParser) formatBindKey(kb *HyprlandKeyBinding) string { func (p *HyprlandParser) formatBindKey(kb *HyprlandKeyBinding) string {
key := kb.Key
if canonical, ok := hyprlandScrollToCanonical(key); ok {
key = canonical
}
parts := make([]string, 0, len(kb.Mods)+1) parts := make([]string, 0, len(kb.Mods)+1)
parts = append(parts, kb.Mods...) parts = append(parts, kb.Mods...)
parts = append(parts, key) parts = append(parts, kb.Key)
return strings.Join(parts, "+") return strings.Join(parts, "+")
} }
@@ -623,7 +619,7 @@ func (p *HyprlandParser) parseLuaLines(content string, baseDir, absPath, section
prevSource := p.currentSource prevSource := p.currentSource
p.currentSource = absPath p.currentSource = absPath
lines := expandLuaConfigLines(strings.Split(content, "\n")) lines := strings.Split(content, "\n")
boundInFile := make(map[string]bool) boundInFile := make(map[string]bool)
for _, line := range lines { for _, line := range lines {
trimmed := strings.TrimSpace(line) trimmed := strings.TrimSpace(line)
@@ -486,61 +486,6 @@ hl.bind("SUPER + 1", hl.dsp.exec_cmd("hyprctl dispatch workspace 1"))
} }
} }
func TestHyprlandSetBindTranslatesScrollWheelToMouse(t *testing.T) {
tmpDir := t.TempDir()
dmsDir := filepath.Join(tmpDir, "dms")
if err := os.MkdirAll(dmsDir, 0o755); err != nil {
t.Fatal(err)
}
bindsUser := filepath.Join(dmsDir, "binds-user.lua")
if err := os.WriteFile(bindsUser, []byte("-- DMS user keybind overrides\n"), 0o644); err != nil {
t.Fatal(err)
}
provider := NewHyprlandProvider(tmpDir)
if err := provider.SetBind("SUPER + WheelScrollDown", "workspace 1", "", nil); err != nil {
t.Fatal(err)
}
got := readFile(t, bindsUser)
if !strings.Contains(got, `hl.bind("SUPER + mouse_down"`) {
t.Fatalf("expected scroll key translated to mouse_down, got:\n%s", got)
}
if strings.Contains(got, "WheelScroll") {
t.Fatalf("expected no raw niri scroll keysym in hyprland output, got:\n%s", got)
}
if err := provider.SetBind("SUPER + WheelScrollDown", "workspace 2", "", nil); err != nil {
t.Fatal(err)
}
got = readFile(t, bindsUser)
if strings.Count(got, `hl.bind("SUPER + mouse_down"`) != 1 {
t.Fatalf("expected exactly one mouse_down bind after re-save, got:\n%s", got)
}
}
func TestHyprlandScrollWheelRoundTrips(t *testing.T) {
for native, canonical := range map[string]string{
"mouse_up": "WheelScrollUp",
"mouse_down": "WheelScrollDown",
"mouse_left": "WheelScrollLeft",
"mouse_right": "WheelScrollRight",
} {
if got := luaKeyComboToInternalKey("SUPER + " + native); got != "SUPER+"+canonical {
t.Errorf("luaKeyComboToInternalKey(%q) = %q, want SUPER+%s", native, got, canonical)
}
}
}
func readFile(t *testing.T, path string) string {
t.Helper()
data, err := os.ReadFile(path)
if err != nil {
t.Fatal(err)
}
return string(data)
}
func TestHyprlandRemoveBindReplacesExistingOverrideWithNegativeOverride(t *testing.T) { func TestHyprlandRemoveBindReplacesExistingOverrideWithNegativeOverride(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
dmsDir := filepath.Join(tmpDir, "dms") dmsDir := filepath.Join(tmpDir, "dms")
@@ -236,9 +236,6 @@ func (m *MangoWCProvider) SetBind(key, action, description string, options map[s
if optionPrefix := m.bindPrefixFromOptions(options); optionPrefix != "" { if optionPrefix := m.bindPrefixFromOptions(options); optionPrefix != "" {
prefix = optionPrefix prefix = optionPrefix
} }
if _, leaf := m.parseKeyString(key); isScrollKey(leaf) {
prefix = mangowcAxisBindPrefix
}
existingBinds[normalizedKey] = &mangowcOverrideBind{ existingBinds[normalizedKey] = &mangowcOverrideBind{
Key: key, Key: key,
@@ -349,12 +346,6 @@ func (m *MangoWCProvider) parseOverrideBindLine(line, precedingComment string) (
keyName := strings.TrimSpace(fields[1]) keyName := strings.TrimSpace(fields[1])
command := strings.TrimSpace(fields[2]) command := strings.TrimSpace(fields[2])
if prefix == mangowcAxisBindPrefix {
if canonical, ok := mangowcDirectionToScroll(keyName); ok {
keyName = canonical
}
}
var params string var params string
if len(fields) > 3 { if len(fields) > 3 {
params = strings.TrimSpace(fields[3]) params = strings.TrimSpace(fields[3])
@@ -374,9 +365,6 @@ func (m *MangoWCProvider) parseOverrideBindLine(line, precedingComment string) (
} }
func (m *MangoWCProvider) isBindPrefix(prefix string) bool { func (m *MangoWCProvider) isBindPrefix(prefix string) bool {
if prefix == mangowcAxisBindPrefix {
return true
}
if !strings.HasPrefix(prefix, "bind") { if !strings.HasPrefix(prefix, "bind") {
return false return false
} }
@@ -603,11 +591,6 @@ func (m *MangoWCProvider) writeBindLine(sb *strings.Builder, bind *mangowcOverri
if prefix == "" { if prefix == "" {
prefix = "bind" prefix = "bind"
} }
if prefix == mangowcAxisBindPrefix {
if direction, ok := mangowcScrollToDirection(key); ok {
key = direction
}
}
sb.WriteString(prefix) sb.WriteString(prefix)
sb.WriteString("=") sb.WriteString("=")
if mods == "" { if mods == "" {
@@ -244,7 +244,7 @@ func (p *MangoWCParser) ParseKeys() []MangoWCKeyBinding {
} }
continue continue
} }
if !strings.HasPrefix(trimmed, "bind") && !strings.HasPrefix(trimmed, mangowcAxisBindPrefix) { if !strings.HasPrefix(trimmed, "bind") {
pendingComment = "" pendingComment = ""
continue continue
} }
@@ -427,7 +427,7 @@ func (p *MangoWCParser) parseFileWithSource(filePath string) ([]MangoWCKeyBindin
continue continue
} }
if !strings.HasPrefix(trimmed, "bind") && !strings.HasPrefix(trimmed, mangowcAxisBindPrefix) { if !strings.HasPrefix(trimmed, "bind") {
pendingComment = "" pendingComment = ""
continue continue
} }
@@ -493,7 +493,7 @@ func (p *MangoWCParser) parseDMSBindsDirectly(dmsBindsPath string) []MangoWCKeyB
// line directly above) is the description: mango feeds inline comments to spawn // line directly above) is the description: mango feeds inline comments to spawn
// as argv, so DMS keeps descriptions on the line above; inline `#` is a fallback. // as argv, so DMS keeps descriptions on the line above; inline `#` is a fallback.
func (p *MangoWCParser) getKeybindAtLineContent(line string, precedingComment string) *MangoWCKeyBinding { func (p *MangoWCParser) getKeybindAtLineContent(line string, precedingComment string) *MangoWCKeyBinding {
bindMatch := regexp.MustCompile(`^(bind[lsrp]*|axisbind)\s*=\s*(.+)$`) bindMatch := regexp.MustCompile(`^(bind[lsrp]*)\s*=\s*(.+)$`)
matches := bindMatch.FindStringSubmatch(line) matches := bindMatch.FindStringSubmatch(line)
if len(matches) < 3 { if len(matches) < 3 {
return nil return nil
@@ -527,12 +527,6 @@ func (p *MangoWCParser) getKeybindAtLineContent(line string, precedingComment st
key := strings.TrimSpace(keyFields[1]) key := strings.TrimSpace(keyFields[1])
command := strings.TrimSpace(keyFields[2]) command := strings.TrimSpace(keyFields[2])
if matches[1] == mangowcAxisBindPrefix {
if canonical, ok := mangowcDirectionToScroll(key); ok {
key = canonical
}
}
var params string var params string
if len(keyFields) > 3 { if len(keyFields) > 3 {
params = strings.TrimSpace(keyFields[3]) params = strings.TrimSpace(keyFields[3])
@@ -6,29 +6,6 @@ import (
"testing" "testing"
) )
func TestMangoWCParseAxisBindToScrollKey(t *testing.T) {
tmpDir := t.TempDir()
cfg := filepath.Join(tmpDir, "config.conf")
content := "axisbind=SUPER,UP,spawn,dms ipc call test\n"
if err := os.WriteFile(cfg, []byte(content), 0o644); err != nil {
t.Fatal(err)
}
binds, err := ParseMangoWCKeys(cfg)
if err != nil {
t.Fatalf("ParseMangoWCKeys failed: %v", err)
}
if len(binds) != 1 {
t.Fatalf("expected 1 bind, got %d", len(binds))
}
if binds[0].Key != "WheelScrollUp" {
t.Fatalf("expected axis direction parsed as WheelScrollUp, got %q", binds[0].Key)
}
if len(binds[0].Mods) != 1 || binds[0].Mods[0] != "SUPER" {
t.Fatalf("expected SUPER mod, got %v", binds[0].Mods)
}
}
func TestMangoWCAutogenerateComment(t *testing.T) { func TestMangoWCAutogenerateComment(t *testing.T) {
tests := []struct { tests := []struct {
command string command string
@@ -417,40 +417,6 @@ bind=SUPER,3,view,3
} }
} }
func TestMangoWCSetBindTranslatesScrollWheelToAxisBind(t *testing.T) {
tmpDir := t.TempDir()
dmsDir := filepath.Join(tmpDir, "dms")
if err := os.MkdirAll(dmsDir, 0o755); err != nil {
t.Fatalf("failed to create dms dir: %v", err)
}
bindsPath := filepath.Join(dmsDir, "binds.conf")
seed := "# === Custom Keybinds ===\nbind=SUPER,t,spawn,ghostty\ngesturebind=none,left,3,focusdir,left\n"
if err := os.WriteFile(bindsPath, []byte(seed), 0o644); err != nil {
t.Fatalf("failed to write seed binds: %v", err)
}
provider := NewMangoWCProvider(tmpDir)
if err := provider.SetBind("SUPER+WheelScrollDown", "spawn dms ipc call test", "Scroll down", nil); err != nil {
t.Fatalf("SetBind failed: %v", err)
}
content := readFile(t, bindsPath)
if !strings.Contains(content, "axisbind=SUPER,DOWN,spawn,dms ipc call test") {
t.Fatalf("expected scroll bind written as axisbind direction, got:\n%s", content)
}
if strings.Contains(content, "WheelScroll") {
t.Fatalf("expected no raw niri scroll keysym in mango output, got:\n%s", content)
}
if err := provider.SetBind("SUPER+WheelScrollDown", "spawn dms ipc call test2", "Scroll down", nil); err != nil {
t.Fatalf("SetBind failed: %v", err)
}
content = readFile(t, bindsPath)
if strings.Count(content, "axisbind=SUPER,DOWN,") != 1 {
t.Fatalf("expected exactly one axisbind after re-save, got:\n%s", content)
}
}
func TestMangoWCRemoveBindPreservesNonBindLines(t *testing.T) { func TestMangoWCRemoveBindPreservesNonBindLines(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
dmsDir := filepath.Join(tmpDir, "dms") dmsDir := filepath.Join(tmpDir, "dms")
+9 -36
View File
@@ -19,20 +19,6 @@ type NiriProvider struct {
parsed bool parsed bool
} }
type niriActionPart struct {
value string
quoted bool
}
var niriActionPropertyOrder = []string{"focus", "show-pointer", "write-to-disk", "skip-confirmation", "delay-ms"}
var niriActionProperties = map[string]struct{}{
"focus": {},
"show-pointer": {},
"write-to-disk": {},
"skip-confirmation": {},
"delay-ms": {},
}
func NewNiriProvider(configDir string) *NiriProvider { func NewNiriProvider(configDir string) *NiriProvider {
if configDir == "" { if configDir == "" {
configDir = defaultNiriConfigDir() configDir = defaultNiriConfigDir()
@@ -69,7 +55,6 @@ func (n *NiriProvider) GetCheatSheet() (*keybinds.CheatSheet, error) {
sheet := &keybinds.CheatSheet{ sheet := &keybinds.CheatSheet{
Title: "Niri Keybinds", Title: "Niri Keybinds",
Provider: n.Name(), Provider: n.Name(),
ModKey: result.ModKey,
Binds: categorizedBinds, Binds: categorizedBinds,
DMSBindsIncluded: result.DMSBindsIncluded, DMSBindsIncluded: result.DMSBindsIncluded,
} }
@@ -367,7 +352,7 @@ func (n *NiriProvider) buildActionFromNode(bindNode *document.Node) string {
} }
if actionNode.Properties != nil { if actionNode.Properties != nil {
for _, propName := range niriActionPropertyOrder { for _, propName := range []string{"focus", "show-pointer", "write-to-disk", "skip-confirmation", "delay-ms"} {
if val, ok := actionNode.Properties.Get(propName); ok { if val, ok := actionNode.Properties.Get(propName); ok {
parts = append(parts, propName+"="+val.String()) parts = append(parts, propName+"="+val.String())
} }
@@ -455,10 +440,10 @@ func (n *NiriProvider) buildActionNode(action string) *document.Node {
return node return node
} }
node.SetName(parts[0].value) node.SetName(parts[0])
for _, arg := range parts[1:] { for _, arg := range parts[1:] {
if n.isNiriActionPropertyToken(arg) { if strings.Contains(arg, "=") {
kv := strings.SplitN(arg.value, "=", 2) kv := strings.SplitN(arg, "=", 2)
switch kv[1] { switch kv[1] {
case "true": case "true":
node.AddProperty(kv[0], true, "") node.AddProperty(kv[0], true, "")
@@ -469,25 +454,13 @@ func (n *NiriProvider) buildActionNode(action string) *document.Node {
} }
continue continue
} }
node.AddArgument(arg.value, "") node.AddArgument(arg, "")
} }
return node return node
} }
func (n *NiriProvider) isNiriActionPropertyToken(part niriActionPart) bool { func (n *NiriProvider) parseActionParts(action string) []string {
if part.quoted || !strings.Contains(part.value, "=") { var parts []string
return false
}
key, _, ok := strings.Cut(part.value, "=")
if !ok {
return false
}
_, ok = niriActionProperties[key]
return ok
}
func (n *NiriProvider) parseActionParts(action string) []niriActionPart {
var parts []niriActionPart
var current strings.Builder var current strings.Builder
var inQuote, escaped, wasQuoted bool var inQuote, escaped, wasQuoted bool
@@ -503,7 +476,7 @@ func (n *NiriProvider) parseActionParts(action string) []niriActionPart {
inQuote = !inQuote inQuote = !inQuote
case r == ' ' && !inQuote: case r == ' ' && !inQuote:
if current.Len() > 0 || wasQuoted { if current.Len() > 0 || wasQuoted {
parts = append(parts, niriActionPart{value: current.String(), quoted: wasQuoted}) parts = append(parts, current.String())
current.Reset() current.Reset()
wasQuoted = false wasQuoted = false
} }
@@ -512,7 +485,7 @@ func (n *NiriProvider) parseActionParts(action string) []niriActionPart {
} }
} }
if current.Len() > 0 || wasQuoted { if current.Len() > 0 || wasQuoted {
parts = append(parts, niriActionPart{value: current.String(), quoted: wasQuoted}) parts = append(parts, current.String())
} }
return parts return parts
} }
+1 -107
View File
@@ -33,7 +33,6 @@ type NiriSection struct {
type NiriParser struct { type NiriParser struct {
configDir string configDir string
modKey string
processedFiles map[string]bool processedFiles map[string]bool
bindMap map[string]*NiriKeyBinding bindMap map[string]*NiriKeyBinding
bindOrder []string bindOrder []string
@@ -52,7 +51,7 @@ type NiriParser struct {
} }
func parseKDL(data []byte) (*document.Document, error) { func parseKDL(data []byte) (*document.Document, error) {
return kdl.Parse(strings.NewReader(normalizeKDLBraces(quoteLeadingUnderscoreIdents(string(data))))) return kdl.Parse(strings.NewReader(normalizeKDLBraces(string(data))))
} }
func normalizeKDLBraces(input string) string { func normalizeKDLBraces(input string) string {
@@ -95,93 +94,6 @@ func normalizeKDLBraces(input string) string {
return sb.String() return sb.String()
} }
// quoteLeadingUnderscoreIdents wraps bare KDL identifiers that begin with '_'
// in double quotes. kdl-go rejects '_' as the first character of a bare
// identifier (e.g. the common `_JAVA_AWT_WM_NONREPARENTING "1"` environment
// node), even though niri's own parser and the KDL spec accept it — so without
// this the whole config fails to parse and no keybinds load. Quoting lets
// kdl-go parse it; this is safe because the niri parser only dispatches on
// fixed node/section names (binds, recent-windows, include, ...) that never
// start with '_', so re-quoting such a name cannot change what DMS reads.
// Underscores elsewhere in an identifier (XDG_CURRENT_DESKTOP) are left
// untouched, and underscores inside strings or comments are skipped. Only a
// leading '_' is handled; other start characters kdl-go over-rejects (e.g. '.'
// or '?') do not occur in niri configs.
func quoteLeadingUnderscoreIdents(input string) string {
var sb strings.Builder
sb.Grow(len(input))
var prev byte
n := len(input)
for i := 0; i < n; {
c := input[i]
switch {
case c == '"':
end := findStringEnd(input, i)
sb.WriteString(input[i:end])
prev = '"'
i = end
case c == '/' && i+1 < n && input[i+1] == '/':
end := findLineCommentEnd(input, i)
sb.WriteString(input[i:end])
prev = '\n'
i = end
case c == '/' && i+1 < n && input[i+1] == '*':
end := findBlockCommentEnd(input, i)
sb.WriteString(input[i:end])
prev = ' '
i = end
case c == '/' && i+1 < n && input[i+1] == '-':
// KDL slashdash: /- comments out the next node/value. Keep the
// marker but treat what follows as a fresh token start, so a
// slashdashed leading-underscore node (e.g. `/-_FOO "1"`) still
// gets quoted instead of crashing kdl-go.
sb.WriteByte('/')
sb.WriteByte('-')
prev = ' '
i += 2
case c == '_' && isIdentBoundary(prev):
end := scanBareIdent(input, i)
sb.WriteByte('"')
sb.WriteString(input[i:end])
sb.WriteByte('"')
prev = '"'
i = end
default:
sb.WriteByte(c)
prev = c
i++
}
}
return sb.String()
}
// isIdentBoundary reports whether the previously emitted byte ends a token, so
// that a following '_' starts a fresh bare identifier rather than sitting in
// the middle of one.
func isIdentBoundary(prev byte) bool {
switch prev {
case 0, ' ', '\t', '\n', '\r', '{', '}', ';', '=', '(', ')', ',':
return true
}
return false
}
// scanBareIdent returns the index just past the bare identifier starting at
// start, stopping at whitespace or any KDL delimiter.
func scanBareIdent(s string, start int) int {
n := len(s)
for i := start; i < n; i++ {
switch s[i] {
case ' ', '\t', '\n', '\r', '"', '{', '}', '(', ')', ';', '=', ',', '/', '\\', '<', '>', '[', ']':
return i
}
}
return n
}
func findStringEnd(s string, start int) int { func findStringEnd(s string, start int) int {
n := len(s) n := len(s)
for i := start + 1; i < n; { for i := start + 1; i < n; {
@@ -238,7 +150,6 @@ func isBraceAdjacentSpace(b byte) bool {
func NewNiriParser(configDir string) *NiriParser { func NewNiriParser(configDir string) *NiriParser {
return &NiriParser{ return &NiriParser{
configDir: configDir, configDir: configDir,
modKey: "Super",
processedFiles: make(map[string]bool), processedFiles: make(map[string]bool),
bindMap: make(map[string]*NiriKeyBinding), bindMap: make(map[string]*NiriKeyBinding),
bindOrder: []string{}, bindOrder: []string{},
@@ -379,8 +290,6 @@ func (p *NiriParser) processNodes(nodes []*document.Node, section *NiriSection,
switch name { switch name {
case "include": case "include":
p.handleInclude(node, section, baseDir) p.handleInclude(node, section, baseDir)
case "input":
p.handleInput(node)
case "binds": case "binds":
p.extractBinds(node, section, "") p.extractBinds(node, section, "")
case "recent-windows": case "recent-windows":
@@ -389,19 +298,6 @@ func (p *NiriParser) processNodes(nodes []*document.Node, section *NiriSection,
} }
} }
func (p *NiriParser) handleInput(node *document.Node) {
for _, child := range node.Children {
if child.Name.String() != "mod-key" || len(child.Arguments) == 0 {
continue
}
modKey := strings.Trim(strings.TrimSpace(child.Arguments[0].String()), "\"")
if modKey != "" {
p.modKey = modKey
}
}
}
func (p *NiriParser) handleInclude(node *document.Node, section *NiriSection, baseDir string) { func (p *NiriParser) handleInclude(node *document.Node, section *NiriSection, baseDir string) {
if len(node.Arguments) == 0 { if len(node.Arguments) == 0 {
return return
@@ -551,7 +447,6 @@ func (p *NiriParser) parseKeyCombo(combo string) ([]string, string) {
type NiriParseResult struct { type NiriParseResult struct {
Section *NiriSection Section *NiriSection
ModKey string
DMSBindsIncluded bool DMSBindsIncluded bool
DMSStatus *DMSBindsStatusInfo DMSStatus *DMSBindsStatusInfo
ConflictingConfigs map[string]*NiriKeyBinding ConflictingConfigs map[string]*NiriKeyBinding
@@ -604,7 +499,6 @@ func ParseNiriKeys(configDir string) (*NiriParseResult, error) {
} }
return &NiriParseResult{ return &NiriParseResult{
Section: section, Section: section,
ModKey: parser.modKey,
DMSBindsIncluded: parser.HasDMSBindsIncluded(), DMSBindsIncluded: parser.HasDMSBindsIncluded(),
DMSStatus: parser.buildDMSStatus(), DMSStatus: parser.buildDMSStatus(),
ConflictingConfigs: parser.conflictingConfigs, ConflictingConfigs: parser.conflictingConfigs,
@@ -7,28 +7,6 @@ import (
"testing" "testing"
) )
func TestNiriParseModKey(t *testing.T) {
config := `input {
mod-key "Alt"
}
binds {
Mod+T { spawn "kitty"; }
}
`
tmpDir := t.TempDir()
if err := os.WriteFile(filepath.Join(tmpDir, "config.kdl"), []byte(config), 0o644); err != nil {
t.Fatalf("Failed to write test config: %v", err)
}
result, err := ParseNiriKeys(tmpDir)
if err != nil {
t.Fatalf("ParseNiriKeys failed: %v", err)
}
if result.ModKey != "Alt" {
t.Errorf("ModKey = %q, want %q", result.ModKey, "Alt")
}
}
func TestNiriParse_NoSpaceBeforeBrace(t *testing.T) { func TestNiriParse_NoSpaceBeforeBrace(t *testing.T) {
config := `recent-windows { config := `recent-windows {
binds { binds {
@@ -93,101 +71,6 @@ func TestNormalizeKDLBraces(t *testing.T) {
} }
} }
func TestQuoteLeadingUnderscoreIdents(t *testing.T) {
tests := []struct {
name string
in string
out string
}{
{"leading underscore node", `_JAVA_AWT_WM_NONREPARENTING "1"`, `"_JAVA_AWT_WM_NONREPARENTING" "1"`},
{"mid underscore untouched", `XDG_CURRENT_DESKTOP "niri"`, `XDG_CURRENT_DESKTOP "niri"`},
{"indented node", "environment {\n _FOO \"1\"\n}", "environment {\n \"_FOO\" \"1\"\n}"},
{"underscore in string", `spawn "_not_a_node"`, `spawn "_not_a_node"`},
{"underscore in line comment", "// _comment\n_FOO \"1\"", "// _comment\n\"_FOO\" \"1\""},
{"underscore in block comment", "/* _x */ _FOO \"1\"", "/* _x */ \"_FOO\" \"1\""},
{"block comment abuts node", `/* x */_FOO "1"`, `/* x */"_FOO" "1"`},
{"slashdash before node", `/-_FOO "1"`, `/-"_FOO" "1"`},
{"node after closing paren", "node (u8)_v", `node (u8)"_v"`},
{"node before brace without space", "_FOO{ }", `"_FOO"{ }`},
{"lone underscore", `_ "x"`, `"_" "x"`},
{"property value", "node key=_val", `node key="_val"`},
{"no underscores", "node child", "node child"},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
got := quoteLeadingUnderscoreIdents(tc.in)
if got != tc.out {
t.Errorf("quoteLeadingUnderscoreIdents(%q) = %q, want %q", tc.in, got, tc.out)
}
})
}
}
func TestNiriParseLeadingUnderscoreEnvironment(t *testing.T) {
tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.kdl")
// A leading-underscore environment node (a common Java/tiling-WM fix) must
// not abort parsing of the rest of the config — keybinds still have to load.
content := `environment {
XDG_CURRENT_DESKTOP "niri"
_JAVA_AWT_WM_NONREPARENTING "1"
}
binds {
Mod+Q { close-window; }
Mod+KP_Home { focus-workspace 1; }
}
`
if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil {
t.Fatalf("Failed to write test config: %v", err)
}
result, err := ParseNiriKeys(tmpDir)
if err != nil {
t.Fatalf("ParseNiriKeys failed on config with leading-underscore env node: %v", err)
}
if len(result.Section.Keybinds) != 2 {
t.Errorf("Expected 2 keybinds, got %d", len(result.Section.Keybinds))
}
foundClose := false
for _, kb := range result.Section.Keybinds {
if kb.Action == "close-window" {
foundClose = true
}
}
if !foundClose {
t.Error("close-window keybind not found — leading-underscore env node broke parsing")
}
}
func TestNiriParseSlashdashLeadingUnderscore(t *testing.T) {
tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.kdl")
// A slashdashed leading-underscore node must not abort parsing either.
content := `environment {
/-_JAVA_AWT_WM_NONREPARENTING "1"
}
binds {
Mod+Q { close-window; }
}
`
if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil {
t.Fatalf("Failed to write test config: %v", err)
}
result, err := ParseNiriKeys(tmpDir)
if err != nil {
t.Fatalf("ParseNiriKeys failed on config with slashdashed leading-underscore node: %v", err)
}
if len(result.Section.Keybinds) != 1 {
t.Errorf("Expected 1 keybind, got %d", len(result.Section.Keybinds))
}
}
func TestNiriParseKeyCombo(t *testing.T) { func TestNiriParseKeyCombo(t *testing.T) {
tests := []struct { tests := []struct {
combo string combo string
+1 -60
View File
@@ -17,10 +17,7 @@ func TestNiriProviderGetCheatSheet(t *testing.T) {
tmpDir := t.TempDir() tmpDir := t.TempDir()
configFile := filepath.Join(tmpDir, "config.kdl") configFile := filepath.Join(tmpDir, "config.kdl")
content := `input { content := `binds {
mod-key "Alt"
}
binds {
Mod+Q { close-window; } Mod+Q { close-window; }
Mod+F { fullscreen-window; } Mod+F { fullscreen-window; }
Mod+T hotkey-overlay-title="Open Terminal" { spawn "kitty"; } Mod+T hotkey-overlay-title="Open Terminal" { spawn "kitty"; }
@@ -48,10 +45,6 @@ binds {
t.Errorf("Provider = %q, want %q", cheatSheet.Provider, "niri") t.Errorf("Provider = %q, want %q", cheatSheet.Provider, "niri")
} }
if cheatSheet.ModKey != "Alt" {
t.Errorf("ModKey = %q, want %q", cheatSheet.ModKey, "Alt")
}
windowBinds := cheatSheet.Binds["Window"] windowBinds := cheatSheet.Binds["Window"]
if len(windowBinds) < 2 { if len(windowBinds) < 2 {
t.Errorf("Expected at least 2 Window binds, got %d", len(windowBinds)) t.Errorf("Expected at least 2 Window binds, got %d", len(windowBinds))
@@ -234,58 +227,6 @@ func TestNiriGenerateBindsContent(t *testing.T) {
expected: `binds { expected: `binds {
Mod+Space hotkey-overlay-title="Application Launcher" { spawn "dms" "ipc" "call" "spotlight" "toggle"; } Mod+Space hotkey-overlay-title="Application Launcher" { spawn "dms" "ipc" "call" "spotlight" "toggle"; }
} }
`,
},
{
name: "spawn with equals arg",
binds: map[string]*overrideBind{
"Mod+B": {
Key: "Mod+B",
Action: `spawn /opt/browser --profile-directory=Default`,
},
},
expected: `binds {
Mod+B { spawn "/opt/browser" "--profile-directory=Default"; }
}
`,
},
{
name: "spawn shell command with quoted equals args",
binds: map[string]*overrideBind{
"Mod+C": {
Key: "Mod+C",
Action: `spawn sh -c "chrome --profile-directory=Default --app=x"`,
},
},
expected: `binds {
Mod+C { spawn "sh" "-c" "chrome --profile-directory=Default --app=x"; }
}
`,
},
{
name: "spawn env assignment stays arg",
binds: map[string]*overrideBind{
"Mod+E": {
Key: "Mod+E",
Action: `spawn env FOO=bar mycmd`,
},
},
expected: `binds {
Mod+E { spawn "env" "FOO=bar" "mycmd"; }
}
`,
},
{
name: "niri action property remains property",
binds: map[string]*overrideBind{
"Print": {
Key: "Print",
Action: `screenshot show-pointer=false`,
},
},
expected: `binds {
Print { screenshot show-pointer=false; }
}
`, `,
}, },
{ {
@@ -1,74 +0,0 @@
package providers
import "strings"
// Scroll-wheel binds are captured by the shell as niri's keysym names
// (WheelScrollUp/Down/Left/Right) regardless of the active compositor. Niri
// consumes them natively; every other provider speaks a different dialect, so the
// raw niri token must be translated on write and back again on read. Without this
// the token is emitted verbatim and the compositor rejects the bind (issue #2683).
var canonicalScrollKeys = map[string]string{
"wheelscrollup": "WheelScrollUp",
"wheelscrolldown": "WheelScrollDown",
"wheelscrollleft": "WheelScrollLeft",
"wheelscrollright": "WheelScrollRight",
}
func isScrollKey(token string) bool {
_, ok := canonicalScrollKeys[strings.ToLower(token)]
return ok
}
// Hyprland binds the wheel inside a regular bind using mouse_up/down/left/right.
var hyprlandScrollNative = map[string]string{
"wheelscrollup": "mouse_up",
"wheelscrolldown": "mouse_down",
"wheelscrollleft": "mouse_left",
"wheelscrollright": "mouse_right",
}
var hyprlandScrollCanonical = map[string]string{
"mouse_up": "WheelScrollUp",
"mouse_down": "WheelScrollDown",
"mouse_left": "WheelScrollLeft",
"mouse_right": "WheelScrollRight",
}
func hyprlandScrollToNative(token string) (string, bool) {
v, ok := hyprlandScrollNative[strings.ToLower(token)]
return v, ok
}
func hyprlandScrollToCanonical(token string) (string, bool) {
v, ok := hyprlandScrollCanonical[strings.ToLower(token)]
return v, ok
}
// MangoWC binds the wheel through a dedicated axisbind directive whose key field
// is a direction (UP/DOWN/LEFT/RIGHT) rather than a keysym.
const mangowcAxisBindPrefix = "axisbind"
var mangowcScrollDirection = map[string]string{
"wheelscrollup": "UP",
"wheelscrolldown": "DOWN",
"wheelscrollleft": "LEFT",
"wheelscrollright": "RIGHT",
}
var mangowcScrollCanonical = map[string]string{
"up": "WheelScrollUp",
"down": "WheelScrollDown",
"left": "WheelScrollLeft",
"right": "WheelScrollRight",
}
func mangowcScrollToDirection(token string) (string, bool) {
v, ok := mangowcScrollDirection[strings.ToLower(token)]
return v, ok
}
func mangowcDirectionToScroll(direction string) (string, bool) {
v, ok := mangowcScrollCanonical[strings.ToLower(direction)]
return v, ok
}
-1
View File
@@ -32,7 +32,6 @@ type DMSBindsStatus struct {
type CheatSheet struct { type CheatSheet struct {
Title string `json:"title"` Title string `json:"title"`
Provider string `json:"provider"` Provider string `json:"provider"`
ModKey string `json:"modKey,omitempty"`
Binds map[string][]Keybind `json:"binds"` Binds map[string][]Keybind `json:"binds"`
DMSBindsIncluded bool `json:"dmsBindsIncluded"` DMSBindsIncluded bool `json:"dmsBindsIncluded"`
DMSStatus *DMSBindsStatus `json:"dmsStatus,omitempty"` DMSStatus *DMSBindsStatus `json:"dmsStatus,omitempty"`
+3 -5
View File
@@ -68,8 +68,6 @@ func GetQtLoggingRules() string {
level = "info" level = "info"
} }
// scene carries QML engine warnings (e.g. QQuickImage "Cannot open" cache
// probes); suppressed except at debug level
var rules []string var rules []string
switch strings.ToLower(level) { switch strings.ToLower(level) {
case "fatal": case "fatal":
@@ -77,13 +75,13 @@ func GetQtLoggingRules() string {
case "error": case "error":
rules = []string{"*.debug=false", "*.info=false", "*.warning=false"} rules = []string{"*.debug=false", "*.info=false", "*.warning=false"}
case "warn", "warning": case "warn", "warning":
rules = []string{"*.debug=false", "*.info=false", "scene.warning=false"} rules = []string{"*.debug=false", "*.info=false"}
case "info": case "info":
rules = []string{"*.debug=false", "scene.warning=false"} rules = []string{"*.debug=false"}
case "debug": case "debug":
return "" return ""
default: default:
rules = []string{"*.debug=false", "scene.warning=false"} rules = []string{"*.debug=false"}
} }
return strings.Join(rules, ";") return strings.Join(rules, ";")
+5 -143
View File
@@ -47,14 +47,13 @@ type TemplateDef struct {
ConfigFile string ConfigFile string
Kind TemplateKind Kind TemplateKind
RunUnconditionally bool RunUnconditionally bool
RequiredEnv string
} }
var templateRegistry = []TemplateDef{ var templateRegistry = []TemplateDef{
{ID: "gtk", Kind: TemplateKindGTK, RunUnconditionally: true}, {ID: "gtk", Kind: TemplateKindGTK, RunUnconditionally: true},
{ID: "niri", Commands: []string{"niri"}, ConfigFile: "niri.toml"}, {ID: "niri", Commands: []string{"niri"}, ConfigFile: "niri.toml"},
{ID: "hyprland", Commands: []string{"Hyprland"}, ConfigFile: "hyprland.toml"}, {ID: "hyprland", Commands: []string{"Hyprland"}, ConfigFile: "hyprland.toml"},
{ID: "mangowc", Commands: []string{"mango"}, ConfigFile: "mangowc.toml", RequiredEnv: "MANGO_INSTANCE_SIGNATURE"}, {ID: "mangowc", Commands: []string{"mango"}, ConfigFile: "mangowc.toml"},
{ID: "qt5ct", Commands: []string{"qt5ct"}, ConfigFile: "qt5ct.toml"}, {ID: "qt5ct", Commands: []string{"qt5ct"}, ConfigFile: "qt5ct.toml"},
{ID: "qt6ct", Commands: []string{"qt6ct"}, ConfigFile: "qt6ct.toml"}, {ID: "qt6ct", Commands: []string{"qt6ct"}, ConfigFile: "qt6ct.toml"},
{ID: "firefox", Commands: []string{"firefox"}, ConfigFile: "firefox.toml"}, {ID: "firefox", Commands: []string{"firefox"}, ConfigFile: "firefox.toml"},
@@ -118,58 +117,10 @@ type ColorsOutput struct {
} `json:"colors"` } `json:"colors"`
} }
type SchemePreview struct {
Dark string `json:"dark"`
Light string `json:"light"`
}
var previewSchemeTypes = []string{
"scheme-tonal-spot",
"scheme-vibrant",
"scheme-content",
"scheme-expressive",
"scheme-fidelity",
"scheme-fruit-salad",
"scheme-monochrome",
"scheme-neutral",
"scheme-rainbow",
}
func PreviewSchemes(sourceColor string, contrast float64) (map[string]SchemePreview, error) {
if sourceColor == "" {
return nil, fmt.Errorf("source color is required")
}
previews := make(map[string]SchemePreview, len(previewSchemeTypes))
for _, schemeType := range previewSchemeTypes {
output, err := runMatugenDryRun(&Options{
Kind: "hex",
Value: sourceColor,
MatugenType: schemeType,
Contrast: contrast,
})
if err != nil {
return nil, fmt.Errorf("preview %s: %w", schemeType, err)
}
dark := extractMatugenColor(output, "primary", "dark")
light := extractMatugenColor(output, "primary", "light")
if dark == "" || light == "" {
return nil, fmt.Errorf("preview %s: primary colors missing from matugen output", schemeType)
}
previews[schemeType] = SchemePreview{Dark: dark, Light: light}
}
return previews, nil
}
func (o *Options) ColorsOutput() string { func (o *Options) ColorsOutput() string {
return filepath.Join(o.StateDir, "dms-colors.json") return filepath.Join(o.StateDir, "dms-colors.json")
} }
func (o *Options) colorsStaging() string {
return o.ColorsOutput() + ".tmp"
}
func (o *Options) ShouldSkipTemplate(name string) bool { func (o *Options) ShouldSkipTemplate(name string) bool {
if o.SkipTemplates == "" { if o.SkipTemplates == "" {
return false return false
@@ -182,38 +133,6 @@ func (o *Options) ShouldSkipTemplate(name string) bool {
return false return false
} }
func acquireMatugenLock(stateDir string) (*os.File, error) {
f, err := os.OpenFile(filepath.Join(stateDir, "matugen.lock"), os.O_CREATE|os.O_RDWR, 0o644)
if err != nil {
return nil, fmt.Errorf("failed to open matugen lock: %w", err)
}
deadline := time.Now().Add(45 * time.Second)
for {
switch err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); err {
case nil:
return f, nil
case syscall.EWOULDBLOCK:
if time.Now().After(deadline) {
f.Close()
return nil, fmt.Errorf("timed out waiting for matugen lock")
}
time.Sleep(100 * time.Millisecond)
default:
f.Close()
return nil, fmt.Errorf("failed to lock matugen: %w", err)
}
}
}
func releaseMatugenLock(f *os.File) {
if f == nil {
return
}
_ = syscall.Flock(int(f.Fd()), syscall.LOCK_UN)
f.Close()
}
func Run(opts Options) error { func Run(opts Options) error {
if opts.StateDir == "" { if opts.StateDir == "" {
return fmt.Errorf("state-dir is required") return fmt.Errorf("state-dir is required")
@@ -247,12 +166,6 @@ func Run(opts Options) error {
return fmt.Errorf("failed to create state dir: %w", err) return fmt.Errorf("failed to create state dir: %w", err)
} }
lock, err := acquireMatugenLock(opts.StateDir)
if err != nil {
return err
}
defer releaseMatugenLock(lock)
log.Infof("Building theme: %s %s (%s)", opts.Kind, opts.Value, opts.Mode) log.Infof("Building theme: %s %s (%s)", opts.Kind, opts.Value, opts.Mode)
changed, buildErr := buildOnce(&opts) changed, buildErr := buildOnce(&opts)
@@ -274,8 +187,6 @@ func Run(opts Options) error {
} }
func buildOnce(opts *Options) (bool, error) { func buildOnce(opts *Options) (bool, error) {
defer os.Remove(opts.colorsStaging())
cfgFile, err := os.CreateTemp("", "matugen-config-*.toml") cfgFile, err := os.CreateTemp("", "matugen-config-*.toml")
if err != nil { if err != nil {
return false, fmt.Errorf("failed to create temp config: %w", err) return false, fmt.Errorf("failed to create temp config: %w", err)
@@ -363,16 +274,10 @@ func buildOnce(opts *Options) (bool, error) {
} }
} }
newColors, err := os.ReadFile(opts.colorsStaging()) newColors, _ := os.ReadFile(opts.ColorsOutput())
if err != nil {
return false, fmt.Errorf("matugen did not produce colors output: %w", err)
}
if bytes.Equal(oldColors, newColors) && len(oldColors) > 0 { if bytes.Equal(oldColors, newColors) && len(oldColors) > 0 {
return false, nil return false, nil
} }
if err := os.Rename(opts.colorsStaging(), opts.ColorsOutput()); err != nil {
return false, fmt.Errorf("failed to commit colors output: %w", err)
}
if opts.ColorsOnly { if opts.ColorsOnly {
return true, nil return true, nil
@@ -440,7 +345,7 @@ func buildMergedConfig(opts *Options, cfgFile *os.File, tmpDir string) error {
input_path = '%s/matugen/templates/dank.json' input_path = '%s/matugen/templates/dank.json'
output_path = '%s' output_path = '%s'
`, opts.ShellDir, opts.colorsStaging()) `, opts.ShellDir, opts.ColorsOutput())
if opts.ColorsOnly { if opts.ColorsOnly {
return nil return nil
@@ -451,9 +356,6 @@ output_path = '%s'
if opts.ShouldSkipTemplate(tmpl.ID) { if opts.ShouldSkipTemplate(tmpl.ID) {
continue continue
} }
if !templateSessionActive(tmpl) {
continue
}
switch tmpl.Kind { switch tmpl.Kind {
case TemplateKindGTK: case TemplateKindGTK:
@@ -587,18 +489,6 @@ func appendTerminalConfig(opts *Options, cfgFile *os.File, tmpDir string, checkC
cfgFile.WriteString("\n") cfgFile.WriteString("\n")
} }
func templateSessionActive(tmpl TemplateDef) bool {
if tmpl.RequiredEnv == "" {
return true
}
socket := os.Getenv(tmpl.RequiredEnv)
if socket == "" {
return false
}
_, err := os.Stat(socket)
return err == nil
}
func appExists(checker utils.AppChecker, checkCmd []string, checkFlatpaks []string) bool { func appExists(checker utils.AppChecker, checkCmd []string, checkFlatpaks []string) bool {
// Both nil is treated as "skip check" / unconditionally run // Both nil is treated as "skip check" / unconditionally run
if checkCmd == nil && checkFlatpaks == nil { if checkCmd == nil && checkFlatpaks == nil {
@@ -699,7 +589,6 @@ func redetectMatugenVersion(old matugenFlags) (matugenFlags, bool) {
func detectMatugenVersionLocked() (matugenFlags, error) { func detectMatugenVersionLocked() (matugenFlags, error) {
cmd := exec.Command("matugen", "--version") cmd := exec.Command("matugen", "--version")
cmd.Env = utils.EnvWithUserBinPath(nil)
output, err := cmd.Output() output, err := cmd.Output()
if err != nil { if err != nil {
return matugenFlags{}, fmt.Errorf("failed to get matugen version: %w", err) return matugenFlags{}, fmt.Errorf("failed to get matugen version: %w", err)
@@ -756,7 +645,6 @@ func runMatugen(baseArgs []string) error {
args := buildMatugenArgs(baseArgs, flags) args := buildMatugenArgs(baseArgs, flags)
cmd := exec.Command("matugen", args...) cmd := exec.Command("matugen", args...)
cmd.Env = utils.EnvWithUserBinPath(nil)
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
runErr := cmd.Run() runErr := cmd.Run()
@@ -774,7 +662,6 @@ func runMatugen(baseArgs []string) error {
log.Warnf("Matugen version changed (v4: %v -> %v), retrying", flags.isV4, newFlags.isV4) log.Warnf("Matugen version changed (v4: %v -> %v), retrying", flags.isV4, newFlags.isV4)
args = buildMatugenArgs(baseArgs, newFlags) args = buildMatugenArgs(baseArgs, newFlags)
retryCmd := exec.Command("matugen", args...) retryCmd := exec.Command("matugen", args...)
retryCmd.Env = utils.EnvWithUserBinPath(nil)
retryCmd.Stdout = os.Stdout retryCmd.Stdout = os.Stdout
retryCmd.Stderr = os.Stderr retryCmd.Stderr = os.Stderr
return retryCmd.Run() return retryCmd.Run()
@@ -817,7 +704,6 @@ func execDryRun(opts *Options, flags matugenFlags) (string, error) {
} }
cmd := exec.Command("matugen", baseArgs...) cmd := exec.Command("matugen", baseArgs...)
cmd.Env = utils.EnvWithUserBinPath(nil)
var stderr strings.Builder var stderr strings.Builder
cmd.Stderr = &stderr cmd.Stderr = &stderr
output, err := cmd.Output() output, err := cmd.Output()
@@ -916,26 +802,7 @@ func refreshGTK(mode ColorMode) {
} }
} }
var colorSchemeEchoHook func(scheme string)
func SetColorSchemeEchoHook(hook func(scheme string)) {
colorSchemeEchoHook = hook
}
func expectColorSchemeEcho(scheme string) {
if colorSchemeEchoHook != nil {
colorSchemeEchoHook(scheme)
}
}
// The color-scheme round trip is the only mechanism that makes running GTK4
// apps reload ~/.config/gtk-4.0 CSS (a gtk-theme flip does not). But apps
// following the portal color-scheme (Chromium) can drop the restore signal
// mid-repaint and latch the wrong mode, so this is opt-in.
func refreshGTK4() { func refreshGTK4() {
if os.Getenv("DMS_ENABLE_GTK4_REFRESH") != "1" {
return
}
output, err := utils.GsettingsGet("org.gnome.desktop.interface", "color-scheme") output, err := utils.GsettingsGet("org.gnome.desktop.interface", "color-scheme")
if err != nil { if err != nil {
return return
@@ -949,13 +816,11 @@ func refreshGTK4() {
toggle = "prefer-dark" toggle = "prefer-dark"
} }
expectColorSchemeEcho(toggle)
if err := utils.GsettingsSet("org.gnome.desktop.interface", "color-scheme", toggle); err != nil { if err := utils.GsettingsSet("org.gnome.desktop.interface", "color-scheme", toggle); err != nil {
log.Warnf("Failed to toggle color-scheme for GTK4 refresh: %v", err) log.Warnf("Failed to toggle color-scheme for GTK4 refresh: %v", err)
return return
} }
time.Sleep(400 * time.Millisecond) time.Sleep(50 * time.Millisecond)
expectColorSchemeEcho(current)
if err := utils.GsettingsSet("org.gnome.desktop.interface", "color-scheme", current); err != nil { if err := utils.GsettingsSet("org.gnome.desktop.interface", "color-scheme", current); err != nil {
log.Warnf("Failed to restore color-scheme for GTK4 refresh: %v", err) log.Warnf("Failed to restore color-scheme for GTK4 refresh: %v", err)
} }
@@ -1056,9 +921,6 @@ func closestAdwaitaAccent(primaryHex string) string {
func syncAccentColor(primaryHex string) { func syncAccentColor(primaryHex string) {
accent := closestAdwaitaAccent(primaryHex) accent := closestAdwaitaAccent(primaryHex)
if cur, err := utils.GsettingsGet("org.gnome.desktop.interface", "accent-color"); err == nil && strings.Trim(cur, "'") == accent {
return
}
log.Infof("Setting GNOME accent color: %s", accent) log.Infof("Setting GNOME accent color: %s", accent)
if err := utils.GsettingsSet("org.gnome.desktop.interface", "accent-color", accent); err != nil { if err := utils.GsettingsSet("org.gnome.desktop.interface", "accent-color", accent); err != nil {
log.Warnf("Failed to set accent-color: %v", err) log.Warnf("Failed to set accent-color: %v", err)
@@ -1089,7 +951,7 @@ func CheckTemplates(checker utils.AppChecker) []TemplateCheck {
case tmpl.Kind == TemplateKindEmacs: case tmpl.Kind == TemplateKindEmacs:
detected = appExists(checker, tmpl.Commands, tmpl.Flatpaks) && utils.EmacsConfigDir() != "" detected = appExists(checker, tmpl.Commands, tmpl.Flatpaks) && utils.EmacsConfigDir() != ""
default: default:
detected = appExists(checker, tmpl.Commands, tmpl.Flatpaks) && templateSessionActive(tmpl) detected = appExists(checker, tmpl.Commands, tmpl.Flatpaks)
} }
checks = append(checks, TemplateCheck{ID: tmpl.ID, Detected: detected}) checks = append(checks, TemplateCheck{ID: tmpl.ID, Detected: detected})
+1 -47
View File
@@ -437,53 +437,7 @@ func TestBuildMergedConfigColorsOnly(t *testing.T) {
content := string(output) content := string(output)
assert.Contains(t, content, "[templates.dank]") assert.Contains(t, content, "[templates.dank]")
assert.Contains(t, content, "output_path = '"+opts.colorsStaging()+"'") assert.Contains(t, content, "output_path = '"+filepath.Join(opts.StateDir, "dms-colors.json")+"'")
assert.NotContains(t, content, "[templates.gtk]") assert.NotContains(t, content, "[templates.gtk]")
assert.False(t, strings.Contains(content, "output_path = 'CONFIG_DIR/"), "colors-only config should not emit app template outputs") assert.False(t, strings.Contains(content, "output_path = 'CONFIG_DIR/"), "colors-only config should not emit app template outputs")
} }
func TestBuildMergedConfigSkipsMangowcWithoutActiveSession(t *testing.T) {
t.Setenv("MANGO_INSTANCE_SIGNATURE", "")
tempDir := t.TempDir()
shellDir := filepath.Join(tempDir, "shell")
configsDir := filepath.Join(shellDir, "matugen", "configs")
if err := os.MkdirAll(configsDir, 0o755); err != nil {
t.Fatalf("failed to create configs dir: %v", err)
}
if err := os.WriteFile(filepath.Join(configsDir, "base.toml"), []byte("[config]\n"), 0o644); err != nil {
t.Fatalf("failed to write base config: %v", err)
}
mangowcConfig := "[templates.dmsmango]\ninput_path = 'in'\noutput_path = 'out'\n"
if err := os.WriteFile(filepath.Join(configsDir, "mangowc.toml"), []byte(mangowcConfig), 0o644); err != nil {
t.Fatalf("failed to write mangowc config: %v", err)
}
cfgFile, err := os.CreateTemp(tempDir, "merged-*.toml")
if err != nil {
t.Fatalf("failed to create temp config: %v", err)
}
defer os.Remove(cfgFile.Name())
defer cfgFile.Close()
opts := &Options{
ShellDir: shellDir,
ConfigDir: filepath.Join(tempDir, "config"),
StateDir: filepath.Join(tempDir, "state"),
SkipTemplates: "gtk,niri,hyprland,qt5ct,qt6ct,firefox,pywalfox,zenbrowser,vesktop,vencord,equibop,ghostty,kitty,foot,alacritty,wezterm,nvim,dgop,kcolorscheme,vscode,emacs,zed",
}
if err := buildMergedConfig(opts, cfgFile, filepath.Join(tempDir, "templates")); err != nil {
t.Fatalf("buildMergedConfig failed: %v", err)
}
if err := cfgFile.Close(); err != nil {
t.Fatalf("failed to close merged config: %v", err)
}
output, err := os.ReadFile(cfgFile.Name())
if err != nil {
t.Fatalf("failed to read merged config: %v", err)
}
assert.NotContains(t, string(output), "[templates.dmsmango]")
}
+35 -45
View File
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_brightness package mocks_brightness
import ( import (
"github.com/godbus/dbus/v5" dbus "github.com/godbus/dbus/v5"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockDBusConn creates a new instance of MockDBusConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockDBusConn(t interface {
mock.TestingT
Cleanup(func())
}) *MockDBusConn {
mock := &MockDBusConn{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockDBusConn is an autogenerated mock type for the DBusConn type // MockDBusConn is an autogenerated mock type for the DBusConn type
type MockDBusConn struct { type MockDBusConn struct {
mock.Mock mock.Mock
@@ -36,20 +20,21 @@ func (_m *MockDBusConn) EXPECT() *MockDBusConn_Expecter {
return &MockDBusConn_Expecter{mock: &_m.Mock} return &MockDBusConn_Expecter{mock: &_m.Mock}
} }
// Close provides a mock function for the type MockDBusConn // Close provides a mock function with no fields
func (_mock *MockDBusConn) Close() error { func (_m *MockDBusConn) Close() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Close") panic("no return value specified for Close")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -70,8 +55,8 @@ func (_c *MockDBusConn_Close_Call) Run(run func()) *MockDBusConn_Close_Call {
return _c return _c
} }
func (_c *MockDBusConn_Close_Call) Return(err error) *MockDBusConn_Close_Call { func (_c *MockDBusConn_Close_Call) Return(_a0 error) *MockDBusConn_Close_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -80,22 +65,23 @@ func (_c *MockDBusConn_Close_Call) RunAndReturn(run func() error) *MockDBusConn_
return _c return _c
} }
// Object provides a mock function for the type MockDBusConn // Object provides a mock function with given fields: dest, path
func (_mock *MockDBusConn) Object(dest string, path dbus.ObjectPath) dbus.BusObject { func (_m *MockDBusConn) Object(dest string, path dbus.ObjectPath) dbus.BusObject {
ret := _mock.Called(dest, path) ret := _m.Called(dest, path)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Object") panic("no return value specified for Object")
} }
var r0 dbus.BusObject var r0 dbus.BusObject
if returnFunc, ok := ret.Get(0).(func(string, dbus.ObjectPath) dbus.BusObject); ok { if rf, ok := ret.Get(0).(func(string, dbus.ObjectPath) dbus.BusObject); ok {
r0 = returnFunc(dest, path) r0 = rf(dest, path)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(dbus.BusObject) r0 = ret.Get(0).(dbus.BusObject)
} }
} }
return r0 return r0
} }
@@ -113,28 +99,32 @@ func (_e *MockDBusConn_Expecter) Object(dest any, path any) *MockDBusConn_Object
func (_c *MockDBusConn_Object_Call) Run(run func(dest string, path dbus.ObjectPath)) *MockDBusConn_Object_Call { func (_c *MockDBusConn_Object_Call) Run(run func(dest string, path dbus.ObjectPath)) *MockDBusConn_Object_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(dbus.ObjectPath))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 dbus.ObjectPath
if args[1] != nil {
arg1 = args[1].(dbus.ObjectPath)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockDBusConn_Object_Call) Return(busObject dbus.BusObject) *MockDBusConn_Object_Call { func (_c *MockDBusConn_Object_Call) Return(_a0 dbus.BusObject) *MockDBusConn_Object_Call {
_c.Call.Return(busObject) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockDBusConn_Object_Call) RunAndReturn(run func(dest string, path dbus.ObjectPath) dbus.BusObject) *MockDBusConn_Object_Call { func (_c *MockDBusConn_Object_Call) RunAndReturn(run func(string, dbus.ObjectPath) dbus.BusObject) *MockDBusConn_Object_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockDBusConn creates a new instance of MockDBusConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockDBusConn(t interface {
mock.TestingT
Cleanup(func())
},
) *MockDBusConn {
mock := &MockDBusConn{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
File diff suppressed because it is too large Load Diff
+175 -331
View File
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_cups_pkhelper package mocks_cups_pkhelper
import ( import (
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/cups" cups "github.com/AvengeMedia/DankMaterialShell/core/internal/server/cups"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockPkHelper creates a new instance of MockPkHelper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockPkHelper(t interface {
mock.TestingT
Cleanup(func())
}) *MockPkHelper {
mock := &MockPkHelper{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockPkHelper is an autogenerated mock type for the PkHelper type // MockPkHelper is an autogenerated mock type for the PkHelper type
type MockPkHelper struct { type MockPkHelper struct {
mock.Mock mock.Mock
@@ -36,20 +20,21 @@ func (_m *MockPkHelper) EXPECT() *MockPkHelper_Expecter {
return &MockPkHelper_Expecter{mock: &_m.Mock} return &MockPkHelper_Expecter{mock: &_m.Mock}
} }
// ClassAddPrinter provides a mock function for the type MockPkHelper // ClassAddPrinter provides a mock function with given fields: className, printerName
func (_mock *MockPkHelper) ClassAddPrinter(className string, printerName string) error { func (_m *MockPkHelper) ClassAddPrinter(className string, printerName string) error {
ret := _mock.Called(className, printerName) ret := _m.Called(className, printerName)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for ClassAddPrinter") panic("no return value specified for ClassAddPrinter")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, string) error); ok { if rf, ok := ret.Get(0).(func(string, string) error); ok {
r0 = returnFunc(className, printerName) r0 = rf(className, printerName)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -61,52 +46,42 @@ type MockPkHelper_ClassAddPrinter_Call struct {
// ClassAddPrinter is a helper method to define mock.On call // ClassAddPrinter is a helper method to define mock.On call
// - className string // - className string
// - printerName string // - printerName string
func (_e *MockPkHelper_Expecter) ClassAddPrinter(className any, printerName any) *MockPkHelper_ClassAddPrinter_Call { func (_e *MockPkHelper_Expecter) ClassAddPrinter(className interface{}, printerName interface{}) *MockPkHelper_ClassAddPrinter_Call {
return &MockPkHelper_ClassAddPrinter_Call{Call: _e.mock.On("ClassAddPrinter", className, printerName)} return &MockPkHelper_ClassAddPrinter_Call{Call: _e.mock.On("ClassAddPrinter", className, printerName)}
} }
func (_c *MockPkHelper_ClassAddPrinter_Call) Run(run func(className string, printerName string)) *MockPkHelper_ClassAddPrinter_Call { func (_c *MockPkHelper_ClassAddPrinter_Call) Run(run func(className string, printerName string)) *MockPkHelper_ClassAddPrinter_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_ClassAddPrinter_Call) Return(err error) *MockPkHelper_ClassAddPrinter_Call { func (_c *MockPkHelper_ClassAddPrinter_Call) Return(_a0 error) *MockPkHelper_ClassAddPrinter_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_ClassAddPrinter_Call) RunAndReturn(run func(className string, printerName string) error) *MockPkHelper_ClassAddPrinter_Call { func (_c *MockPkHelper_ClassAddPrinter_Call) RunAndReturn(run func(string, string) error) *MockPkHelper_ClassAddPrinter_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// ClassDelete provides a mock function for the type MockPkHelper // ClassDelete provides a mock function with given fields: className
func (_mock *MockPkHelper) ClassDelete(className string) error { func (_m *MockPkHelper) ClassDelete(className string) error {
ret := _mock.Called(className) ret := _m.Called(className)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for ClassDelete") panic("no return value specified for ClassDelete")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string) error); ok { if rf, ok := ret.Get(0).(func(string) error); ok {
r0 = returnFunc(className) r0 = rf(className)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -117,47 +92,42 @@ type MockPkHelper_ClassDelete_Call struct {
// ClassDelete is a helper method to define mock.On call // ClassDelete is a helper method to define mock.On call
// - className string // - className string
func (_e *MockPkHelper_Expecter) ClassDelete(className any) *MockPkHelper_ClassDelete_Call { func (_e *MockPkHelper_Expecter) ClassDelete(className interface{}) *MockPkHelper_ClassDelete_Call {
return &MockPkHelper_ClassDelete_Call{Call: _e.mock.On("ClassDelete", className)} return &MockPkHelper_ClassDelete_Call{Call: _e.mock.On("ClassDelete", className)}
} }
func (_c *MockPkHelper_ClassDelete_Call) Run(run func(className string)) *MockPkHelper_ClassDelete_Call { func (_c *MockPkHelper_ClassDelete_Call) Run(run func(className string)) *MockPkHelper_ClassDelete_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_ClassDelete_Call) Return(err error) *MockPkHelper_ClassDelete_Call { func (_c *MockPkHelper_ClassDelete_Call) Return(_a0 error) *MockPkHelper_ClassDelete_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_ClassDelete_Call) RunAndReturn(run func(className string) error) *MockPkHelper_ClassDelete_Call { func (_c *MockPkHelper_ClassDelete_Call) RunAndReturn(run func(string) error) *MockPkHelper_ClassDelete_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// ClassDeletePrinter provides a mock function for the type MockPkHelper // ClassDeletePrinter provides a mock function with given fields: className, printerName
func (_mock *MockPkHelper) ClassDeletePrinter(className string, printerName string) error { func (_m *MockPkHelper) ClassDeletePrinter(className string, printerName string) error {
ret := _mock.Called(className, printerName) ret := _m.Called(className, printerName)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for ClassDeletePrinter") panic("no return value specified for ClassDeletePrinter")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, string) error); ok { if rf, ok := ret.Get(0).(func(string, string) error); ok {
r0 = returnFunc(className, printerName) r0 = rf(className, printerName)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -169,41 +139,30 @@ type MockPkHelper_ClassDeletePrinter_Call struct {
// ClassDeletePrinter is a helper method to define mock.On call // ClassDeletePrinter is a helper method to define mock.On call
// - className string // - className string
// - printerName string // - printerName string
func (_e *MockPkHelper_Expecter) ClassDeletePrinter(className any, printerName any) *MockPkHelper_ClassDeletePrinter_Call { func (_e *MockPkHelper_Expecter) ClassDeletePrinter(className interface{}, printerName interface{}) *MockPkHelper_ClassDeletePrinter_Call {
return &MockPkHelper_ClassDeletePrinter_Call{Call: _e.mock.On("ClassDeletePrinter", className, printerName)} return &MockPkHelper_ClassDeletePrinter_Call{Call: _e.mock.On("ClassDeletePrinter", className, printerName)}
} }
func (_c *MockPkHelper_ClassDeletePrinter_Call) Run(run func(className string, printerName string)) *MockPkHelper_ClassDeletePrinter_Call { func (_c *MockPkHelper_ClassDeletePrinter_Call) Run(run func(className string, printerName string)) *MockPkHelper_ClassDeletePrinter_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_ClassDeletePrinter_Call) Return(err error) *MockPkHelper_ClassDeletePrinter_Call { func (_c *MockPkHelper_ClassDeletePrinter_Call) Return(_a0 error) *MockPkHelper_ClassDeletePrinter_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_ClassDeletePrinter_Call) RunAndReturn(run func(className string, printerName string) error) *MockPkHelper_ClassDeletePrinter_Call { func (_c *MockPkHelper_ClassDeletePrinter_Call) RunAndReturn(run func(string, string) error) *MockPkHelper_ClassDeletePrinter_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// DevicesGet provides a mock function for the type MockPkHelper // DevicesGet provides a mock function with given fields: timeout, limit, includeSchemes, excludeSchemes
func (_mock *MockPkHelper) DevicesGet(timeout int, limit int, includeSchemes []string, excludeSchemes []string) ([]cups.Device, error) { func (_m *MockPkHelper) DevicesGet(timeout int, limit int, includeSchemes []string, excludeSchemes []string) ([]cups.Device, error) {
ret := _mock.Called(timeout, limit, includeSchemes, excludeSchemes) ret := _m.Called(timeout, limit, includeSchemes, excludeSchemes)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for DevicesGet") panic("no return value specified for DevicesGet")
@@ -211,21 +170,23 @@ func (_mock *MockPkHelper) DevicesGet(timeout int, limit int, includeSchemes []s
var r0 []cups.Device var r0 []cups.Device
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(int, int, []string, []string) ([]cups.Device, error)); ok { if rf, ok := ret.Get(0).(func(int, int, []string, []string) ([]cups.Device, error)); ok {
return returnFunc(timeout, limit, includeSchemes, excludeSchemes) return rf(timeout, limit, includeSchemes, excludeSchemes)
} }
if returnFunc, ok := ret.Get(0).(func(int, int, []string, []string) []cups.Device); ok { if rf, ok := ret.Get(0).(func(int, int, []string, []string) []cups.Device); ok {
r0 = returnFunc(timeout, limit, includeSchemes, excludeSchemes) r0 = rf(timeout, limit, includeSchemes, excludeSchemes)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]cups.Device) r0 = ret.Get(0).([]cups.Device)
} }
} }
if returnFunc, ok := ret.Get(1).(func(int, int, []string, []string) error); ok {
r1 = returnFunc(timeout, limit, includeSchemes, excludeSchemes) if rf, ok := ret.Get(1).(func(int, int, []string, []string) error); ok {
r1 = rf(timeout, limit, includeSchemes, excludeSchemes)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -239,62 +200,42 @@ type MockPkHelper_DevicesGet_Call struct {
// - limit int // - limit int
// - includeSchemes []string // - includeSchemes []string
// - excludeSchemes []string // - excludeSchemes []string
func (_e *MockPkHelper_Expecter) DevicesGet(timeout any, limit any, includeSchemes any, excludeSchemes any) *MockPkHelper_DevicesGet_Call { func (_e *MockPkHelper_Expecter) DevicesGet(timeout interface{}, limit interface{}, includeSchemes interface{}, excludeSchemes interface{}) *MockPkHelper_DevicesGet_Call {
return &MockPkHelper_DevicesGet_Call{Call: _e.mock.On("DevicesGet", timeout, limit, includeSchemes, excludeSchemes)} return &MockPkHelper_DevicesGet_Call{Call: _e.mock.On("DevicesGet", timeout, limit, includeSchemes, excludeSchemes)}
} }
func (_c *MockPkHelper_DevicesGet_Call) Run(run func(timeout int, limit int, includeSchemes []string, excludeSchemes []string)) *MockPkHelper_DevicesGet_Call { func (_c *MockPkHelper_DevicesGet_Call) Run(run func(timeout int, limit int, includeSchemes []string, excludeSchemes []string)) *MockPkHelper_DevicesGet_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 int run(args[0].(int), args[1].(int), args[2].([]string), args[3].([]string))
if args[0] != nil {
arg0 = args[0].(int)
}
var arg1 int
if args[1] != nil {
arg1 = args[1].(int)
}
var arg2 []string
if args[2] != nil {
arg2 = args[2].([]string)
}
var arg3 []string
if args[3] != nil {
arg3 = args[3].([]string)
}
run(
arg0,
arg1,
arg2,
arg3,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_DevicesGet_Call) Return(devices []cups.Device, err error) *MockPkHelper_DevicesGet_Call { func (_c *MockPkHelper_DevicesGet_Call) Return(_a0 []cups.Device, _a1 error) *MockPkHelper_DevicesGet_Call {
_c.Call.Return(devices, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockPkHelper_DevicesGet_Call) RunAndReturn(run func(timeout int, limit int, includeSchemes []string, excludeSchemes []string) ([]cups.Device, error)) *MockPkHelper_DevicesGet_Call { func (_c *MockPkHelper_DevicesGet_Call) RunAndReturn(run func(int, int, []string, []string) ([]cups.Device, error)) *MockPkHelper_DevicesGet_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// JobCancelPurge provides a mock function for the type MockPkHelper // JobCancelPurge provides a mock function with given fields: jobID, purge
func (_mock *MockPkHelper) JobCancelPurge(jobID int, purge bool) error { func (_m *MockPkHelper) JobCancelPurge(jobID int, purge bool) error {
ret := _mock.Called(jobID, purge) ret := _m.Called(jobID, purge)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for JobCancelPurge") panic("no return value specified for JobCancelPurge")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(int, bool) error); ok { if rf, ok := ret.Get(0).(func(int, bool) error); ok {
r0 = returnFunc(jobID, purge) r0 = rf(jobID, purge)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -306,52 +247,42 @@ type MockPkHelper_JobCancelPurge_Call struct {
// JobCancelPurge is a helper method to define mock.On call // JobCancelPurge is a helper method to define mock.On call
// - jobID int // - jobID int
// - purge bool // - purge bool
func (_e *MockPkHelper_Expecter) JobCancelPurge(jobID any, purge any) *MockPkHelper_JobCancelPurge_Call { func (_e *MockPkHelper_Expecter) JobCancelPurge(jobID interface{}, purge interface{}) *MockPkHelper_JobCancelPurge_Call {
return &MockPkHelper_JobCancelPurge_Call{Call: _e.mock.On("JobCancelPurge", jobID, purge)} return &MockPkHelper_JobCancelPurge_Call{Call: _e.mock.On("JobCancelPurge", jobID, purge)}
} }
func (_c *MockPkHelper_JobCancelPurge_Call) Run(run func(jobID int, purge bool)) *MockPkHelper_JobCancelPurge_Call { func (_c *MockPkHelper_JobCancelPurge_Call) Run(run func(jobID int, purge bool)) *MockPkHelper_JobCancelPurge_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 int run(args[0].(int), args[1].(bool))
if args[0] != nil {
arg0 = args[0].(int)
}
var arg1 bool
if args[1] != nil {
arg1 = args[1].(bool)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_JobCancelPurge_Call) Return(err error) *MockPkHelper_JobCancelPurge_Call { func (_c *MockPkHelper_JobCancelPurge_Call) Return(_a0 error) *MockPkHelper_JobCancelPurge_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_JobCancelPurge_Call) RunAndReturn(run func(jobID int, purge bool) error) *MockPkHelper_JobCancelPurge_Call { func (_c *MockPkHelper_JobCancelPurge_Call) RunAndReturn(run func(int, bool) error) *MockPkHelper_JobCancelPurge_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// JobRestart provides a mock function for the type MockPkHelper // JobRestart provides a mock function with given fields: jobID
func (_mock *MockPkHelper) JobRestart(jobID int) error { func (_m *MockPkHelper) JobRestart(jobID int) error {
ret := _mock.Called(jobID) ret := _m.Called(jobID)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for JobRestart") panic("no return value specified for JobRestart")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(int) error); ok { if rf, ok := ret.Get(0).(func(int) error); ok {
r0 = returnFunc(jobID) r0 = rf(jobID)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -362,47 +293,42 @@ type MockPkHelper_JobRestart_Call struct {
// JobRestart is a helper method to define mock.On call // JobRestart is a helper method to define mock.On call
// - jobID int // - jobID int
func (_e *MockPkHelper_Expecter) JobRestart(jobID any) *MockPkHelper_JobRestart_Call { func (_e *MockPkHelper_Expecter) JobRestart(jobID interface{}) *MockPkHelper_JobRestart_Call {
return &MockPkHelper_JobRestart_Call{Call: _e.mock.On("JobRestart", jobID)} return &MockPkHelper_JobRestart_Call{Call: _e.mock.On("JobRestart", jobID)}
} }
func (_c *MockPkHelper_JobRestart_Call) Run(run func(jobID int)) *MockPkHelper_JobRestart_Call { func (_c *MockPkHelper_JobRestart_Call) Run(run func(jobID int)) *MockPkHelper_JobRestart_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 int run(args[0].(int))
if args[0] != nil {
arg0 = args[0].(int)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_JobRestart_Call) Return(err error) *MockPkHelper_JobRestart_Call { func (_c *MockPkHelper_JobRestart_Call) Return(_a0 error) *MockPkHelper_JobRestart_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_JobRestart_Call) RunAndReturn(run func(jobID int) error) *MockPkHelper_JobRestart_Call { func (_c *MockPkHelper_JobRestart_Call) RunAndReturn(run func(int) error) *MockPkHelper_JobRestart_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// JobSetHoldUntil provides a mock function for the type MockPkHelper // JobSetHoldUntil provides a mock function with given fields: jobID, holdUntil
func (_mock *MockPkHelper) JobSetHoldUntil(jobID int, holdUntil string) error { func (_m *MockPkHelper) JobSetHoldUntil(jobID int, holdUntil string) error {
ret := _mock.Called(jobID, holdUntil) ret := _m.Called(jobID, holdUntil)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for JobSetHoldUntil") panic("no return value specified for JobSetHoldUntil")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(int, string) error); ok { if rf, ok := ret.Get(0).(func(int, string) error); ok {
r0 = returnFunc(jobID, holdUntil) r0 = rf(jobID, holdUntil)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -414,52 +340,42 @@ type MockPkHelper_JobSetHoldUntil_Call struct {
// JobSetHoldUntil is a helper method to define mock.On call // JobSetHoldUntil is a helper method to define mock.On call
// - jobID int // - jobID int
// - holdUntil string // - holdUntil string
func (_e *MockPkHelper_Expecter) JobSetHoldUntil(jobID any, holdUntil any) *MockPkHelper_JobSetHoldUntil_Call { func (_e *MockPkHelper_Expecter) JobSetHoldUntil(jobID interface{}, holdUntil interface{}) *MockPkHelper_JobSetHoldUntil_Call {
return &MockPkHelper_JobSetHoldUntil_Call{Call: _e.mock.On("JobSetHoldUntil", jobID, holdUntil)} return &MockPkHelper_JobSetHoldUntil_Call{Call: _e.mock.On("JobSetHoldUntil", jobID, holdUntil)}
} }
func (_c *MockPkHelper_JobSetHoldUntil_Call) Run(run func(jobID int, holdUntil string)) *MockPkHelper_JobSetHoldUntil_Call { func (_c *MockPkHelper_JobSetHoldUntil_Call) Run(run func(jobID int, holdUntil string)) *MockPkHelper_JobSetHoldUntil_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 int run(args[0].(int), args[1].(string))
if args[0] != nil {
arg0 = args[0].(int)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_JobSetHoldUntil_Call) Return(err error) *MockPkHelper_JobSetHoldUntil_Call { func (_c *MockPkHelper_JobSetHoldUntil_Call) Return(_a0 error) *MockPkHelper_JobSetHoldUntil_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_JobSetHoldUntil_Call) RunAndReturn(run func(jobID int, holdUntil string) error) *MockPkHelper_JobSetHoldUntil_Call { func (_c *MockPkHelper_JobSetHoldUntil_Call) RunAndReturn(run func(int, string) error) *MockPkHelper_JobSetHoldUntil_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PrinterAdd provides a mock function for the type MockPkHelper // PrinterAdd provides a mock function with given fields: name, uri, ppd, info, location
func (_mock *MockPkHelper) PrinterAdd(name string, uri string, ppd string, info string, location string) error { func (_m *MockPkHelper) PrinterAdd(name string, uri string, ppd string, info string, location string) error {
ret := _mock.Called(name, uri, ppd, info, location) ret := _m.Called(name, uri, ppd, info, location)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PrinterAdd") panic("no return value specified for PrinterAdd")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, string, string, string, string) error); ok { if rf, ok := ret.Get(0).(func(string, string, string, string, string) error); ok {
r0 = returnFunc(name, uri, ppd, info, location) r0 = rf(name, uri, ppd, info, location)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -474,67 +390,42 @@ type MockPkHelper_PrinterAdd_Call struct {
// - ppd string // - ppd string
// - info string // - info string
// - location string // - location string
func (_e *MockPkHelper_Expecter) PrinterAdd(name any, uri any, ppd any, info any, location any) *MockPkHelper_PrinterAdd_Call { func (_e *MockPkHelper_Expecter) PrinterAdd(name interface{}, uri interface{}, ppd interface{}, info interface{}, location interface{}) *MockPkHelper_PrinterAdd_Call {
return &MockPkHelper_PrinterAdd_Call{Call: _e.mock.On("PrinterAdd", name, uri, ppd, info, location)} return &MockPkHelper_PrinterAdd_Call{Call: _e.mock.On("PrinterAdd", name, uri, ppd, info, location)}
} }
func (_c *MockPkHelper_PrinterAdd_Call) Run(run func(name string, uri string, ppd string, info string, location string)) *MockPkHelper_PrinterAdd_Call { func (_c *MockPkHelper_PrinterAdd_Call) Run(run func(name string, uri string, ppd string, info string, location string)) *MockPkHelper_PrinterAdd_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(string), args[2].(string), args[3].(string), args[4].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
var arg2 string
if args[2] != nil {
arg2 = args[2].(string)
}
var arg3 string
if args[3] != nil {
arg3 = args[3].(string)
}
var arg4 string
if args[4] != nil {
arg4 = args[4].(string)
}
run(
arg0,
arg1,
arg2,
arg3,
arg4,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_PrinterAdd_Call) Return(err error) *MockPkHelper_PrinterAdd_Call { func (_c *MockPkHelper_PrinterAdd_Call) Return(_a0 error) *MockPkHelper_PrinterAdd_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_PrinterAdd_Call) RunAndReturn(run func(name string, uri string, ppd string, info string, location string) error) *MockPkHelper_PrinterAdd_Call { func (_c *MockPkHelper_PrinterAdd_Call) RunAndReturn(run func(string, string, string, string, string) error) *MockPkHelper_PrinterAdd_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PrinterDelete provides a mock function for the type MockPkHelper // PrinterDelete provides a mock function with given fields: name
func (_mock *MockPkHelper) PrinterDelete(name string) error { func (_m *MockPkHelper) PrinterDelete(name string) error {
ret := _mock.Called(name) ret := _m.Called(name)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PrinterDelete") panic("no return value specified for PrinterDelete")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string) error); ok { if rf, ok := ret.Get(0).(func(string) error); ok {
r0 = returnFunc(name) r0 = rf(name)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -545,47 +436,42 @@ type MockPkHelper_PrinterDelete_Call struct {
// PrinterDelete is a helper method to define mock.On call // PrinterDelete is a helper method to define mock.On call
// - name string // - name string
func (_e *MockPkHelper_Expecter) PrinterDelete(name any) *MockPkHelper_PrinterDelete_Call { func (_e *MockPkHelper_Expecter) PrinterDelete(name interface{}) *MockPkHelper_PrinterDelete_Call {
return &MockPkHelper_PrinterDelete_Call{Call: _e.mock.On("PrinterDelete", name)} return &MockPkHelper_PrinterDelete_Call{Call: _e.mock.On("PrinterDelete", name)}
} }
func (_c *MockPkHelper_PrinterDelete_Call) Run(run func(name string)) *MockPkHelper_PrinterDelete_Call { func (_c *MockPkHelper_PrinterDelete_Call) Run(run func(name string)) *MockPkHelper_PrinterDelete_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_PrinterDelete_Call) Return(err error) *MockPkHelper_PrinterDelete_Call { func (_c *MockPkHelper_PrinterDelete_Call) Return(_a0 error) *MockPkHelper_PrinterDelete_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_PrinterDelete_Call) RunAndReturn(run func(name string) error) *MockPkHelper_PrinterDelete_Call { func (_c *MockPkHelper_PrinterDelete_Call) RunAndReturn(run func(string) error) *MockPkHelper_PrinterDelete_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PrinterSetAcceptJobs provides a mock function for the type MockPkHelper // PrinterSetAcceptJobs provides a mock function with given fields: name, enabled, reason
func (_mock *MockPkHelper) PrinterSetAcceptJobs(name string, enabled bool, reason string) error { func (_m *MockPkHelper) PrinterSetAcceptJobs(name string, enabled bool, reason string) error {
ret := _mock.Called(name, enabled, reason) ret := _m.Called(name, enabled, reason)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PrinterSetAcceptJobs") panic("no return value specified for PrinterSetAcceptJobs")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, bool, string) error); ok { if rf, ok := ret.Get(0).(func(string, bool, string) error); ok {
r0 = returnFunc(name, enabled, reason) r0 = rf(name, enabled, reason)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -598,57 +484,42 @@ type MockPkHelper_PrinterSetAcceptJobs_Call struct {
// - name string // - name string
// - enabled bool // - enabled bool
// - reason string // - reason string
func (_e *MockPkHelper_Expecter) PrinterSetAcceptJobs(name any, enabled any, reason any) *MockPkHelper_PrinterSetAcceptJobs_Call { func (_e *MockPkHelper_Expecter) PrinterSetAcceptJobs(name interface{}, enabled interface{}, reason interface{}) *MockPkHelper_PrinterSetAcceptJobs_Call {
return &MockPkHelper_PrinterSetAcceptJobs_Call{Call: _e.mock.On("PrinterSetAcceptJobs", name, enabled, reason)} return &MockPkHelper_PrinterSetAcceptJobs_Call{Call: _e.mock.On("PrinterSetAcceptJobs", name, enabled, reason)}
} }
func (_c *MockPkHelper_PrinterSetAcceptJobs_Call) Run(run func(name string, enabled bool, reason string)) *MockPkHelper_PrinterSetAcceptJobs_Call { func (_c *MockPkHelper_PrinterSetAcceptJobs_Call) Run(run func(name string, enabled bool, reason string)) *MockPkHelper_PrinterSetAcceptJobs_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(bool), args[2].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 bool
if args[1] != nil {
arg1 = args[1].(bool)
}
var arg2 string
if args[2] != nil {
arg2 = args[2].(string)
}
run(
arg0,
arg1,
arg2,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetAcceptJobs_Call) Return(err error) *MockPkHelper_PrinterSetAcceptJobs_Call { func (_c *MockPkHelper_PrinterSetAcceptJobs_Call) Return(_a0 error) *MockPkHelper_PrinterSetAcceptJobs_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetAcceptJobs_Call) RunAndReturn(run func(name string, enabled bool, reason string) error) *MockPkHelper_PrinterSetAcceptJobs_Call { func (_c *MockPkHelper_PrinterSetAcceptJobs_Call) RunAndReturn(run func(string, bool, string) error) *MockPkHelper_PrinterSetAcceptJobs_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PrinterSetEnabled provides a mock function for the type MockPkHelper // PrinterSetEnabled provides a mock function with given fields: name, enabled
func (_mock *MockPkHelper) PrinterSetEnabled(name string, enabled bool) error { func (_m *MockPkHelper) PrinterSetEnabled(name string, enabled bool) error {
ret := _mock.Called(name, enabled) ret := _m.Called(name, enabled)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PrinterSetEnabled") panic("no return value specified for PrinterSetEnabled")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, bool) error); ok { if rf, ok := ret.Get(0).(func(string, bool) error); ok {
r0 = returnFunc(name, enabled) r0 = rf(name, enabled)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -660,52 +531,42 @@ type MockPkHelper_PrinterSetEnabled_Call struct {
// PrinterSetEnabled is a helper method to define mock.On call // PrinterSetEnabled is a helper method to define mock.On call
// - name string // - name string
// - enabled bool // - enabled bool
func (_e *MockPkHelper_Expecter) PrinterSetEnabled(name any, enabled any) *MockPkHelper_PrinterSetEnabled_Call { func (_e *MockPkHelper_Expecter) PrinterSetEnabled(name interface{}, enabled interface{}) *MockPkHelper_PrinterSetEnabled_Call {
return &MockPkHelper_PrinterSetEnabled_Call{Call: _e.mock.On("PrinterSetEnabled", name, enabled)} return &MockPkHelper_PrinterSetEnabled_Call{Call: _e.mock.On("PrinterSetEnabled", name, enabled)}
} }
func (_c *MockPkHelper_PrinterSetEnabled_Call) Run(run func(name string, enabled bool)) *MockPkHelper_PrinterSetEnabled_Call { func (_c *MockPkHelper_PrinterSetEnabled_Call) Run(run func(name string, enabled bool)) *MockPkHelper_PrinterSetEnabled_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(bool))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 bool
if args[1] != nil {
arg1 = args[1].(bool)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetEnabled_Call) Return(err error) *MockPkHelper_PrinterSetEnabled_Call { func (_c *MockPkHelper_PrinterSetEnabled_Call) Return(_a0 error) *MockPkHelper_PrinterSetEnabled_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetEnabled_Call) RunAndReturn(run func(name string, enabled bool) error) *MockPkHelper_PrinterSetEnabled_Call { func (_c *MockPkHelper_PrinterSetEnabled_Call) RunAndReturn(run func(string, bool) error) *MockPkHelper_PrinterSetEnabled_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PrinterSetInfo provides a mock function for the type MockPkHelper // PrinterSetInfo provides a mock function with given fields: name, info
func (_mock *MockPkHelper) PrinterSetInfo(name string, info string) error { func (_m *MockPkHelper) PrinterSetInfo(name string, info string) error {
ret := _mock.Called(name, info) ret := _m.Called(name, info)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PrinterSetInfo") panic("no return value specified for PrinterSetInfo")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, string) error); ok { if rf, ok := ret.Get(0).(func(string, string) error); ok {
r0 = returnFunc(name, info) r0 = rf(name, info)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -717,52 +578,42 @@ type MockPkHelper_PrinterSetInfo_Call struct {
// PrinterSetInfo is a helper method to define mock.On call // PrinterSetInfo is a helper method to define mock.On call
// - name string // - name string
// - info string // - info string
func (_e *MockPkHelper_Expecter) PrinterSetInfo(name any, info any) *MockPkHelper_PrinterSetInfo_Call { func (_e *MockPkHelper_Expecter) PrinterSetInfo(name interface{}, info interface{}) *MockPkHelper_PrinterSetInfo_Call {
return &MockPkHelper_PrinterSetInfo_Call{Call: _e.mock.On("PrinterSetInfo", name, info)} return &MockPkHelper_PrinterSetInfo_Call{Call: _e.mock.On("PrinterSetInfo", name, info)}
} }
func (_c *MockPkHelper_PrinterSetInfo_Call) Run(run func(name string, info string)) *MockPkHelper_PrinterSetInfo_Call { func (_c *MockPkHelper_PrinterSetInfo_Call) Run(run func(name string, info string)) *MockPkHelper_PrinterSetInfo_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetInfo_Call) Return(err error) *MockPkHelper_PrinterSetInfo_Call { func (_c *MockPkHelper_PrinterSetInfo_Call) Return(_a0 error) *MockPkHelper_PrinterSetInfo_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetInfo_Call) RunAndReturn(run func(name string, info string) error) *MockPkHelper_PrinterSetInfo_Call { func (_c *MockPkHelper_PrinterSetInfo_Call) RunAndReturn(run func(string, string) error) *MockPkHelper_PrinterSetInfo_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PrinterSetLocation provides a mock function for the type MockPkHelper // PrinterSetLocation provides a mock function with given fields: name, location
func (_mock *MockPkHelper) PrinterSetLocation(name string, location string) error { func (_m *MockPkHelper) PrinterSetLocation(name string, location string) error {
ret := _mock.Called(name, location) ret := _m.Called(name, location)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PrinterSetLocation") panic("no return value specified for PrinterSetLocation")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, string) error); ok { if rf, ok := ret.Get(0).(func(string, string) error); ok {
r0 = returnFunc(name, location) r0 = rf(name, location)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -774,52 +625,42 @@ type MockPkHelper_PrinterSetLocation_Call struct {
// PrinterSetLocation is a helper method to define mock.On call // PrinterSetLocation is a helper method to define mock.On call
// - name string // - name string
// - location string // - location string
func (_e *MockPkHelper_Expecter) PrinterSetLocation(name any, location any) *MockPkHelper_PrinterSetLocation_Call { func (_e *MockPkHelper_Expecter) PrinterSetLocation(name interface{}, location interface{}) *MockPkHelper_PrinterSetLocation_Call {
return &MockPkHelper_PrinterSetLocation_Call{Call: _e.mock.On("PrinterSetLocation", name, location)} return &MockPkHelper_PrinterSetLocation_Call{Call: _e.mock.On("PrinterSetLocation", name, location)}
} }
func (_c *MockPkHelper_PrinterSetLocation_Call) Run(run func(name string, location string)) *MockPkHelper_PrinterSetLocation_Call { func (_c *MockPkHelper_PrinterSetLocation_Call) Run(run func(name string, location string)) *MockPkHelper_PrinterSetLocation_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetLocation_Call) Return(err error) *MockPkHelper_PrinterSetLocation_Call { func (_c *MockPkHelper_PrinterSetLocation_Call) Return(_a0 error) *MockPkHelper_PrinterSetLocation_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetLocation_Call) RunAndReturn(run func(name string, location string) error) *MockPkHelper_PrinterSetLocation_Call { func (_c *MockPkHelper_PrinterSetLocation_Call) RunAndReturn(run func(string, string) error) *MockPkHelper_PrinterSetLocation_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PrinterSetShared provides a mock function for the type MockPkHelper // PrinterSetShared provides a mock function with given fields: name, shared
func (_mock *MockPkHelper) PrinterSetShared(name string, shared bool) error { func (_m *MockPkHelper) PrinterSetShared(name string, shared bool) error {
ret := _mock.Called(name, shared) ret := _m.Called(name, shared)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PrinterSetShared") panic("no return value specified for PrinterSetShared")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, bool) error); ok { if rf, ok := ret.Get(0).(func(string, bool) error); ok {
r0 = returnFunc(name, shared) r0 = rf(name, shared)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -831,34 +672,37 @@ type MockPkHelper_PrinterSetShared_Call struct {
// PrinterSetShared is a helper method to define mock.On call // PrinterSetShared is a helper method to define mock.On call
// - name string // - name string
// - shared bool // - shared bool
func (_e *MockPkHelper_Expecter) PrinterSetShared(name any, shared any) *MockPkHelper_PrinterSetShared_Call { func (_e *MockPkHelper_Expecter) PrinterSetShared(name interface{}, shared interface{}) *MockPkHelper_PrinterSetShared_Call {
return &MockPkHelper_PrinterSetShared_Call{Call: _e.mock.On("PrinterSetShared", name, shared)} return &MockPkHelper_PrinterSetShared_Call{Call: _e.mock.On("PrinterSetShared", name, shared)}
} }
func (_c *MockPkHelper_PrinterSetShared_Call) Run(run func(name string, shared bool)) *MockPkHelper_PrinterSetShared_Call { func (_c *MockPkHelper_PrinterSetShared_Call) Run(run func(name string, shared bool)) *MockPkHelper_PrinterSetShared_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(bool))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 bool
if args[1] != nil {
arg1 = args[1].(bool)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetShared_Call) Return(err error) *MockPkHelper_PrinterSetShared_Call { func (_c *MockPkHelper_PrinterSetShared_Call) Return(_a0 error) *MockPkHelper_PrinterSetShared_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockPkHelper_PrinterSetShared_Call) RunAndReturn(run func(name string, shared bool) error) *MockPkHelper_PrinterSetShared_Call { func (_c *MockPkHelper_PrinterSetShared_Call) RunAndReturn(run func(string, bool) error) *MockPkHelper_PrinterSetShared_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockPkHelper creates a new instance of MockPkHelper. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockPkHelper(t interface {
mock.TestingT
Cleanup(func())
}) *MockPkHelper {
mock := &MockPkHelper{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
+81 -81
View File
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_evdev package mocks_evdev
import ( import (
"github.com/holoplot/go-evdev" go_evdev "github.com/holoplot/go-evdev"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockEvdevDevice creates a new instance of MockEvdevDevice. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockEvdevDevice(t interface {
mock.TestingT
Cleanup(func())
}) *MockEvdevDevice {
mock := &MockEvdevDevice{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockEvdevDevice is an autogenerated mock type for the EvdevDevice type // MockEvdevDevice is an autogenerated mock type for the EvdevDevice type
type MockEvdevDevice struct { type MockEvdevDevice struct {
mock.Mock mock.Mock
@@ -36,20 +20,21 @@ func (_m *MockEvdevDevice) EXPECT() *MockEvdevDevice_Expecter {
return &MockEvdevDevice_Expecter{mock: &_m.Mock} return &MockEvdevDevice_Expecter{mock: &_m.Mock}
} }
// Close provides a mock function for the type MockEvdevDevice // Close provides a mock function with no fields
func (_mock *MockEvdevDevice) Close() error { func (_m *MockEvdevDevice) Close() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Close") panic("no return value specified for Close")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -70,8 +55,8 @@ func (_c *MockEvdevDevice_Close_Call) Run(run func()) *MockEvdevDevice_Close_Cal
return _c return _c
} }
func (_c *MockEvdevDevice_Close_Call) Return(err error) *MockEvdevDevice_Close_Call { func (_c *MockEvdevDevice_Close_Call) Return(_a0 error) *MockEvdevDevice_Close_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -80,9 +65,9 @@ func (_c *MockEvdevDevice_Close_Call) RunAndReturn(run func() error) *MockEvdevD
return _c return _c
} }
// Name provides a mock function for the type MockEvdevDevice // Name provides a mock function with no fields
func (_mock *MockEvdevDevice) Name() (string, error) { func (_m *MockEvdevDevice) Name() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Name") panic("no return value specified for Name")
@@ -90,19 +75,21 @@ func (_mock *MockEvdevDevice) Name() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -123,8 +110,8 @@ func (_c *MockEvdevDevice_Name_Call) Run(run func()) *MockEvdevDevice_Name_Call
return _c return _c
} }
func (_c *MockEvdevDevice_Name_Call) Return(s string, err error) *MockEvdevDevice_Name_Call { func (_c *MockEvdevDevice_Name_Call) Return(_a0 string, _a1 error) *MockEvdevDevice_Name_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -133,20 +120,21 @@ func (_c *MockEvdevDevice_Name_Call) RunAndReturn(run func() (string, error)) *M
return _c return _c
} }
// Path provides a mock function for the type MockEvdevDevice // Path provides a mock function with no fields
func (_mock *MockEvdevDevice) Path() string { func (_m *MockEvdevDevice) Path() string {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Path") panic("no return value specified for Path")
} }
var r0 string var r0 string
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
return r0 return r0
} }
@@ -167,8 +155,8 @@ func (_c *MockEvdevDevice_Path_Call) Run(run func()) *MockEvdevDevice_Path_Call
return _c return _c
} }
func (_c *MockEvdevDevice_Path_Call) Return(s string) *MockEvdevDevice_Path_Call { func (_c *MockEvdevDevice_Path_Call) Return(_a0 string) *MockEvdevDevice_Path_Call {
_c.Call.Return(s) _c.Call.Return(_a0)
return _c return _c
} }
@@ -177,31 +165,33 @@ func (_c *MockEvdevDevice_Path_Call) RunAndReturn(run func() string) *MockEvdevD
return _c return _c
} }
// ReadOne provides a mock function for the type MockEvdevDevice // ReadOne provides a mock function with no fields
func (_mock *MockEvdevDevice) ReadOne() (*evdev.InputEvent, error) { func (_m *MockEvdevDevice) ReadOne() (*go_evdev.InputEvent, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for ReadOne") panic("no return value specified for ReadOne")
} }
var r0 *evdev.InputEvent var r0 *go_evdev.InputEvent
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (*evdev.InputEvent, error)); ok { if rf, ok := ret.Get(0).(func() (*go_evdev.InputEvent, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() *evdev.InputEvent); ok { if rf, ok := ret.Get(0).(func() *go_evdev.InputEvent); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*evdev.InputEvent) r0 = ret.Get(0).(*go_evdev.InputEvent)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -222,41 +212,43 @@ func (_c *MockEvdevDevice_ReadOne_Call) Run(run func()) *MockEvdevDevice_ReadOne
return _c return _c
} }
func (_c *MockEvdevDevice_ReadOne_Call) Return(inputEvent *evdev.InputEvent, err error) *MockEvdevDevice_ReadOne_Call { func (_c *MockEvdevDevice_ReadOne_Call) Return(_a0 *go_evdev.InputEvent, _a1 error) *MockEvdevDevice_ReadOne_Call {
_c.Call.Return(inputEvent, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockEvdevDevice_ReadOne_Call) RunAndReturn(run func() (*evdev.InputEvent, error)) *MockEvdevDevice_ReadOne_Call { func (_c *MockEvdevDevice_ReadOne_Call) RunAndReturn(run func() (*go_evdev.InputEvent, error)) *MockEvdevDevice_ReadOne_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// State provides a mock function for the type MockEvdevDevice // State provides a mock function with given fields: t
func (_mock *MockEvdevDevice) State(t evdev.EvType) (evdev.StateMap, error) { func (_m *MockEvdevDevice) State(t go_evdev.EvType) (go_evdev.StateMap, error) {
ret := _mock.Called(t) ret := _m.Called(t)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for State") panic("no return value specified for State")
} }
var r0 evdev.StateMap var r0 go_evdev.StateMap
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(evdev.EvType) (evdev.StateMap, error)); ok { if rf, ok := ret.Get(0).(func(go_evdev.EvType) (go_evdev.StateMap, error)); ok {
return returnFunc(t) return rf(t)
} }
if returnFunc, ok := ret.Get(0).(func(evdev.EvType) evdev.StateMap); ok { if rf, ok := ret.Get(0).(func(go_evdev.EvType) go_evdev.StateMap); ok {
r0 = returnFunc(t) r0 = rf(t)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(evdev.StateMap) r0 = ret.Get(0).(go_evdev.StateMap)
} }
} }
if returnFunc, ok := ret.Get(1).(func(evdev.EvType) error); ok {
r1 = returnFunc(t) if rf, ok := ret.Get(1).(func(go_evdev.EvType) error); ok {
r1 = rf(t)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -266,30 +258,38 @@ type MockEvdevDevice_State_Call struct {
} }
// State is a helper method to define mock.On call // State is a helper method to define mock.On call
// - t evdev.EvType // - t go_evdev.EvType
func (_e *MockEvdevDevice_Expecter) State(t any) *MockEvdevDevice_State_Call { func (_e *MockEvdevDevice_Expecter) State(t interface{}) *MockEvdevDevice_State_Call {
return &MockEvdevDevice_State_Call{Call: _e.mock.On("State", t)} return &MockEvdevDevice_State_Call{Call: _e.mock.On("State", t)}
} }
func (_c *MockEvdevDevice_State_Call) Run(run func(t evdev.EvType)) *MockEvdevDevice_State_Call { func (_c *MockEvdevDevice_State_Call) Run(run func(t go_evdev.EvType)) *MockEvdevDevice_State_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 evdev.EvType run(args[0].(go_evdev.EvType))
if args[0] != nil {
arg0 = args[0].(evdev.EvType)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockEvdevDevice_State_Call) Return(stateMap evdev.StateMap, err error) *MockEvdevDevice_State_Call { func (_c *MockEvdevDevice_State_Call) Return(_a0 go_evdev.StateMap, _a1 error) *MockEvdevDevice_State_Call {
_c.Call.Return(stateMap, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockEvdevDevice_State_Call) RunAndReturn(run func(t evdev.EvType) (evdev.StateMap, error)) *MockEvdevDevice_State_Call { func (_c *MockEvdevDevice_State_Call) RunAndReturn(run func(go_evdev.EvType) (go_evdev.StateMap, error)) *MockEvdevDevice_State_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockEvdevDevice creates a new instance of MockEvdevDevice. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockEvdevDevice(t interface {
mock.TestingT
Cleanup(func())
}) *MockEvdevDevice {
mock := &MockEvdevDevice{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
+49 -62
View File
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_geolocation package mocks_geolocation
import ( import (
"github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation" geolocation "github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockClient creates a new instance of MockClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockClient(t interface {
mock.TestingT
Cleanup(func())
}) *MockClient {
mock := &MockClient{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockClient is an autogenerated mock type for the Client type // MockClient is an autogenerated mock type for the Client type
type MockClient struct { type MockClient struct {
mock.Mock mock.Mock
@@ -36,10 +20,9 @@ func (_m *MockClient) EXPECT() *MockClient_Expecter {
return &MockClient_Expecter{mock: &_m.Mock} return &MockClient_Expecter{mock: &_m.Mock}
} }
// Close provides a mock function for the type MockClient // Close provides a mock function with no fields
func (_mock *MockClient) Close() { func (_m *MockClient) Close() {
_mock.Called() _m.Called()
return
} }
// MockClient_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' // MockClient_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
@@ -69,9 +52,9 @@ func (_c *MockClient_Close_Call) RunAndReturn(run func()) *MockClient_Close_Call
return _c return _c
} }
// GetLocation provides a mock function for the type MockClient // GetLocation provides a mock function with no fields
func (_mock *MockClient) GetLocation() (geolocation.Location, error) { func (_m *MockClient) GetLocation() (geolocation.Location, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetLocation") panic("no return value specified for GetLocation")
@@ -79,19 +62,21 @@ func (_mock *MockClient) GetLocation() (geolocation.Location, error) {
var r0 geolocation.Location var r0 geolocation.Location
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (geolocation.Location, error)); ok { if rf, ok := ret.Get(0).(func() (geolocation.Location, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() geolocation.Location); ok { if rf, ok := ret.Get(0).(func() geolocation.Location); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(geolocation.Location) r0 = ret.Get(0).(geolocation.Location)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -112,8 +97,8 @@ func (_c *MockClient_GetLocation_Call) Run(run func()) *MockClient_GetLocation_C
return _c return _c
} }
func (_c *MockClient_GetLocation_Call) Return(location geolocation.Location, err error) *MockClient_GetLocation_Call { func (_c *MockClient_GetLocation_Call) Return(_a0 geolocation.Location, _a1 error) *MockClient_GetLocation_Call {
_c.Call.Return(location, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -122,22 +107,23 @@ func (_c *MockClient_GetLocation_Call) RunAndReturn(run func() (geolocation.Loca
return _c return _c
} }
// Subscribe provides a mock function for the type MockClient // Subscribe provides a mock function with given fields: id
func (_mock *MockClient) Subscribe(id string) chan geolocation.Location { func (_m *MockClient) Subscribe(id string) chan geolocation.Location {
ret := _mock.Called(id) ret := _m.Called(id)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Subscribe") panic("no return value specified for Subscribe")
} }
var r0 chan geolocation.Location var r0 chan geolocation.Location
if returnFunc, ok := ret.Get(0).(func(string) chan geolocation.Location); ok { if rf, ok := ret.Get(0).(func(string) chan geolocation.Location); ok {
r0 = returnFunc(id) r0 = rf(id)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(chan geolocation.Location) r0 = ret.Get(0).(chan geolocation.Location)
} }
} }
return r0 return r0
} }
@@ -148,37 +134,30 @@ type MockClient_Subscribe_Call struct {
// Subscribe is a helper method to define mock.On call // Subscribe is a helper method to define mock.On call
// - id string // - id string
func (_e *MockClient_Expecter) Subscribe(id any) *MockClient_Subscribe_Call { func (_e *MockClient_Expecter) Subscribe(id interface{}) *MockClient_Subscribe_Call {
return &MockClient_Subscribe_Call{Call: _e.mock.On("Subscribe", id)} return &MockClient_Subscribe_Call{Call: _e.mock.On("Subscribe", id)}
} }
func (_c *MockClient_Subscribe_Call) Run(run func(id string)) *MockClient_Subscribe_Call { func (_c *MockClient_Subscribe_Call) Run(run func(id string)) *MockClient_Subscribe_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockClient_Subscribe_Call) Return(locationCh chan geolocation.Location) *MockClient_Subscribe_Call { func (_c *MockClient_Subscribe_Call) Return(_a0 chan geolocation.Location) *MockClient_Subscribe_Call {
_c.Call.Return(locationCh) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockClient_Subscribe_Call) RunAndReturn(run func(id string) chan geolocation.Location) *MockClient_Subscribe_Call { func (_c *MockClient_Subscribe_Call) RunAndReturn(run func(string) chan geolocation.Location) *MockClient_Subscribe_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// Unsubscribe provides a mock function for the type MockClient // Unsubscribe provides a mock function with given fields: id
func (_mock *MockClient) Unsubscribe(id string) { func (_m *MockClient) Unsubscribe(id string) {
_mock.Called(id) _m.Called(id)
return
} }
// MockClient_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe' // MockClient_Unsubscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Unsubscribe'
@@ -188,19 +167,13 @@ type MockClient_Unsubscribe_Call struct {
// Unsubscribe is a helper method to define mock.On call // Unsubscribe is a helper method to define mock.On call
// - id string // - id string
func (_e *MockClient_Expecter) Unsubscribe(id any) *MockClient_Unsubscribe_Call { func (_e *MockClient_Expecter) Unsubscribe(id interface{}) *MockClient_Unsubscribe_Call {
return &MockClient_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe", id)} return &MockClient_Unsubscribe_Call{Call: _e.mock.On("Unsubscribe", id)}
} }
func (_c *MockClient_Unsubscribe_Call) Run(run func(id string)) *MockClient_Unsubscribe_Call { func (_c *MockClient_Unsubscribe_Call) Run(run func(id string)) *MockClient_Unsubscribe_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
@@ -210,7 +183,21 @@ func (_c *MockClient_Unsubscribe_Call) Return() *MockClient_Unsubscribe_Call {
return _c return _c
} }
func (_c *MockClient_Unsubscribe_Call) RunAndReturn(run func(id string)) *MockClient_Unsubscribe_Call { func (_c *MockClient_Unsubscribe_Call) RunAndReturn(run func(string)) *MockClient_Unsubscribe_Call {
_c.Run(run) _c.Run(run)
return _c return _c
} }
// NewMockClient creates a new instance of MockClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockClient(t interface {
mock.TestingT
Cleanup(func())
}) *MockClient {
mock := &MockClient{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,29 +1,14 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package gonetworkmanager package gonetworkmanager
import ( import (
"github.com/Wifx/gonetworkmanager/v2" gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
"github.com/godbus/dbus/v5" dbus "github.com/godbus/dbus/v5"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockAccessPoint creates a new instance of MockAccessPoint. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockAccessPoint(t interface {
mock.TestingT
Cleanup(func())
}) *MockAccessPoint {
mock := &MockAccessPoint{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockAccessPoint is an autogenerated mock type for the AccessPoint type // MockAccessPoint is an autogenerated mock type for the AccessPoint type
type MockAccessPoint struct { type MockAccessPoint struct {
mock.Mock mock.Mock
@@ -37,20 +22,21 @@ func (_m *MockAccessPoint) EXPECT() *MockAccessPoint_Expecter {
return &MockAccessPoint_Expecter{mock: &_m.Mock} return &MockAccessPoint_Expecter{mock: &_m.Mock}
} }
// GetPath provides a mock function for the type MockAccessPoint // GetPath provides a mock function with no fields
func (_mock *MockAccessPoint) GetPath() dbus.ObjectPath { func (_m *MockAccessPoint) GetPath() dbus.ObjectPath {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPath") panic("no return value specified for GetPath")
} }
var r0 dbus.ObjectPath var r0 dbus.ObjectPath
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok { if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(dbus.ObjectPath) r0 = ret.Get(0).(dbus.ObjectPath)
} }
return r0 return r0
} }
@@ -71,8 +57,8 @@ func (_c *MockAccessPoint_GetPath_Call) Run(run func()) *MockAccessPoint_GetPath
return _c return _c
} }
func (_c *MockAccessPoint_GetPath_Call) Return(objectPath dbus.ObjectPath) *MockAccessPoint_GetPath_Call { func (_c *MockAccessPoint_GetPath_Call) Return(_a0 dbus.ObjectPath) *MockAccessPoint_GetPath_Call {
_c.Call.Return(objectPath) _c.Call.Return(_a0)
return _c return _c
} }
@@ -81,9 +67,9 @@ func (_c *MockAccessPoint_GetPath_Call) RunAndReturn(run func() dbus.ObjectPath)
return _c return _c
} }
// GetPropertyFlags provides a mock function for the type MockAccessPoint // GetPropertyFlags provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyFlags() (uint32, error) { func (_m *MockAccessPoint) GetPropertyFlags() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyFlags") panic("no return value specified for GetPropertyFlags")
@@ -91,19 +77,21 @@ func (_mock *MockAccessPoint) GetPropertyFlags() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -124,8 +112,8 @@ func (_c *MockAccessPoint_GetPropertyFlags_Call) Run(run func()) *MockAccessPoin
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyFlags_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyFlags_Call { func (_c *MockAccessPoint_GetPropertyFlags_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyFlags_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -134,9 +122,9 @@ func (_c *MockAccessPoint_GetPropertyFlags_Call) RunAndReturn(run func() (uint32
return _c return _c
} }
// GetPropertyFrequency provides a mock function for the type MockAccessPoint // GetPropertyFrequency provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyFrequency() (uint32, error) { func (_m *MockAccessPoint) GetPropertyFrequency() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyFrequency") panic("no return value specified for GetPropertyFrequency")
@@ -144,19 +132,21 @@ func (_mock *MockAccessPoint) GetPropertyFrequency() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -177,8 +167,8 @@ func (_c *MockAccessPoint_GetPropertyFrequency_Call) Run(run func()) *MockAccess
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyFrequency_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyFrequency_Call { func (_c *MockAccessPoint_GetPropertyFrequency_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyFrequency_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -187,9 +177,9 @@ func (_c *MockAccessPoint_GetPropertyFrequency_Call) RunAndReturn(run func() (ui
return _c return _c
} }
// GetPropertyHWAddress provides a mock function for the type MockAccessPoint // GetPropertyHWAddress provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyHWAddress() (string, error) { func (_m *MockAccessPoint) GetPropertyHWAddress() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyHWAddress") panic("no return value specified for GetPropertyHWAddress")
@@ -197,19 +187,21 @@ func (_mock *MockAccessPoint) GetPropertyHWAddress() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -230,8 +222,8 @@ func (_c *MockAccessPoint_GetPropertyHWAddress_Call) Run(run func()) *MockAccess
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyHWAddress_Call) Return(s string, err error) *MockAccessPoint_GetPropertyHWAddress_Call { func (_c *MockAccessPoint_GetPropertyHWAddress_Call) Return(_a0 string, _a1 error) *MockAccessPoint_GetPropertyHWAddress_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -240,9 +232,9 @@ func (_c *MockAccessPoint_GetPropertyHWAddress_Call) RunAndReturn(run func() (st
return _c return _c
} }
// GetPropertyLastSeen provides a mock function for the type MockAccessPoint // GetPropertyLastSeen provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyLastSeen() (int32, error) { func (_m *MockAccessPoint) GetPropertyLastSeen() (int32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyLastSeen") panic("no return value specified for GetPropertyLastSeen")
@@ -250,19 +242,21 @@ func (_mock *MockAccessPoint) GetPropertyLastSeen() (int32, error) {
var r0 int32 var r0 int32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (int32, error)); ok { if rf, ok := ret.Get(0).(func() (int32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() int32); ok { if rf, ok := ret.Get(0).(func() int32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(int32) r0 = ret.Get(0).(int32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -283,8 +277,8 @@ func (_c *MockAccessPoint_GetPropertyLastSeen_Call) Run(run func()) *MockAccessP
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyLastSeen_Call) Return(n int32, err error) *MockAccessPoint_GetPropertyLastSeen_Call { func (_c *MockAccessPoint_GetPropertyLastSeen_Call) Return(_a0 int32, _a1 error) *MockAccessPoint_GetPropertyLastSeen_Call {
_c.Call.Return(n, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -293,9 +287,9 @@ func (_c *MockAccessPoint_GetPropertyLastSeen_Call) RunAndReturn(run func() (int
return _c return _c
} }
// GetPropertyMaxBitrate provides a mock function for the type MockAccessPoint // GetPropertyMaxBitrate provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyMaxBitrate() (uint32, error) { func (_m *MockAccessPoint) GetPropertyMaxBitrate() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyMaxBitrate") panic("no return value specified for GetPropertyMaxBitrate")
@@ -303,19 +297,21 @@ func (_mock *MockAccessPoint) GetPropertyMaxBitrate() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -336,8 +332,8 @@ func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) Run(run func()) *MockAcces
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyMaxBitrate_Call { func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyMaxBitrate_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -346,9 +342,9 @@ func (_c *MockAccessPoint_GetPropertyMaxBitrate_Call) RunAndReturn(run func() (u
return _c return _c
} }
// GetPropertyMode provides a mock function for the type MockAccessPoint // GetPropertyMode provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyMode() (gonetworkmanager.Nm80211Mode, error) { func (_m *MockAccessPoint) GetPropertyMode() (gonetworkmanager.Nm80211Mode, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyMode") panic("no return value specified for GetPropertyMode")
@@ -356,19 +352,21 @@ func (_mock *MockAccessPoint) GetPropertyMode() (gonetworkmanager.Nm80211Mode, e
var r0 gonetworkmanager.Nm80211Mode var r0 gonetworkmanager.Nm80211Mode
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.Nm80211Mode, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.Nm80211Mode, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.Nm80211Mode); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.Nm80211Mode); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(gonetworkmanager.Nm80211Mode) r0 = ret.Get(0).(gonetworkmanager.Nm80211Mode)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -389,8 +387,8 @@ func (_c *MockAccessPoint_GetPropertyMode_Call) Run(run func()) *MockAccessPoint
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyMode_Call) Return(nm80211Mode gonetworkmanager.Nm80211Mode, err error) *MockAccessPoint_GetPropertyMode_Call { func (_c *MockAccessPoint_GetPropertyMode_Call) Return(_a0 gonetworkmanager.Nm80211Mode, _a1 error) *MockAccessPoint_GetPropertyMode_Call {
_c.Call.Return(nm80211Mode, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -399,9 +397,9 @@ func (_c *MockAccessPoint_GetPropertyMode_Call) RunAndReturn(run func() (gonetwo
return _c return _c
} }
// GetPropertyRSNFlags provides a mock function for the type MockAccessPoint // GetPropertyRSNFlags provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyRSNFlags() (uint32, error) { func (_m *MockAccessPoint) GetPropertyRSNFlags() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyRSNFlags") panic("no return value specified for GetPropertyRSNFlags")
@@ -409,19 +407,21 @@ func (_mock *MockAccessPoint) GetPropertyRSNFlags() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -442,8 +442,8 @@ func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) Run(run func()) *MockAccessP
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyRSNFlags_Call { func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyRSNFlags_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -452,9 +452,9 @@ func (_c *MockAccessPoint_GetPropertyRSNFlags_Call) RunAndReturn(run func() (uin
return _c return _c
} }
// GetPropertySSID provides a mock function for the type MockAccessPoint // GetPropertySSID provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertySSID() (string, error) { func (_m *MockAccessPoint) GetPropertySSID() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertySSID") panic("no return value specified for GetPropertySSID")
@@ -462,19 +462,21 @@ func (_mock *MockAccessPoint) GetPropertySSID() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -495,8 +497,8 @@ func (_c *MockAccessPoint_GetPropertySSID_Call) Run(run func()) *MockAccessPoint
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertySSID_Call) Return(s string, err error) *MockAccessPoint_GetPropertySSID_Call { func (_c *MockAccessPoint_GetPropertySSID_Call) Return(_a0 string, _a1 error) *MockAccessPoint_GetPropertySSID_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -505,9 +507,9 @@ func (_c *MockAccessPoint_GetPropertySSID_Call) RunAndReturn(run func() (string,
return _c return _c
} }
// GetPropertyStrength provides a mock function for the type MockAccessPoint // GetPropertyStrength provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyStrength() (uint8, error) { func (_m *MockAccessPoint) GetPropertyStrength() (uint8, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyStrength") panic("no return value specified for GetPropertyStrength")
@@ -515,19 +517,21 @@ func (_mock *MockAccessPoint) GetPropertyStrength() (uint8, error) {
var r0 uint8 var r0 uint8
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint8, error)); ok { if rf, ok := ret.Get(0).(func() (uint8, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint8); ok { if rf, ok := ret.Get(0).(func() uint8); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint8) r0 = ret.Get(0).(uint8)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -548,8 +552,8 @@ func (_c *MockAccessPoint_GetPropertyStrength_Call) Run(run func()) *MockAccessP
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyStrength_Call) Return(v uint8, err error) *MockAccessPoint_GetPropertyStrength_Call { func (_c *MockAccessPoint_GetPropertyStrength_Call) Return(_a0 uint8, _a1 error) *MockAccessPoint_GetPropertyStrength_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -558,9 +562,9 @@ func (_c *MockAccessPoint_GetPropertyStrength_Call) RunAndReturn(run func() (uin
return _c return _c
} }
// GetPropertyWPAFlags provides a mock function for the type MockAccessPoint // GetPropertyWPAFlags provides a mock function with no fields
func (_mock *MockAccessPoint) GetPropertyWPAFlags() (uint32, error) { func (_m *MockAccessPoint) GetPropertyWPAFlags() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyWPAFlags") panic("no return value specified for GetPropertyWPAFlags")
@@ -568,19 +572,21 @@ func (_mock *MockAccessPoint) GetPropertyWPAFlags() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -601,8 +607,8 @@ func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) Run(run func()) *MockAccessP
return _c return _c
} }
func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) Return(v uint32, err error) *MockAccessPoint_GetPropertyWPAFlags_Call { func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) Return(_a0 uint32, _a1 error) *MockAccessPoint_GetPropertyWPAFlags_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -611,9 +617,9 @@ func (_c *MockAccessPoint_GetPropertyWPAFlags_Call) RunAndReturn(run func() (uin
return _c return _c
} }
// MarshalJSON provides a mock function for the type MockAccessPoint // MarshalJSON provides a mock function with no fields
func (_mock *MockAccessPoint) MarshalJSON() ([]byte, error) { func (_m *MockAccessPoint) MarshalJSON() ([]byte, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for MarshalJSON") panic("no return value specified for MarshalJSON")
@@ -621,21 +627,23 @@ func (_mock *MockAccessPoint) MarshalJSON() ([]byte, error) {
var r0 []byte var r0 []byte
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]byte, error)); ok { if rf, ok := ret.Get(0).(func() ([]byte, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []byte); ok { if rf, ok := ret.Get(0).(func() []byte); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]byte) r0 = ret.Get(0).([]byte)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -656,8 +664,8 @@ func (_c *MockAccessPoint_MarshalJSON_Call) Run(run func()) *MockAccessPoint_Mar
return _c return _c
} }
func (_c *MockAccessPoint_MarshalJSON_Call) Return(bytes []byte, err error) *MockAccessPoint_MarshalJSON_Call { func (_c *MockAccessPoint_MarshalJSON_Call) Return(_a0 []byte, _a1 error) *MockAccessPoint_MarshalJSON_Call {
_c.Call.Return(bytes, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -665,3 +673,17 @@ func (_c *MockAccessPoint_MarshalJSON_Call) RunAndReturn(run func() ([]byte, err
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockAccessPoint creates a new instance of MockAccessPoint. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockAccessPoint(t interface {
mock.TestingT
Cleanup(func())
}) *MockAccessPoint {
mock := &MockAccessPoint{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,29 +1,14 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package gonetworkmanager package gonetworkmanager
import ( import (
"github.com/Wifx/gonetworkmanager/v2" gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
"github.com/godbus/dbus/v5" dbus "github.com/godbus/dbus/v5"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockActiveConnection creates a new instance of MockActiveConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockActiveConnection(t interface {
mock.TestingT
Cleanup(func())
}) *MockActiveConnection {
mock := &MockActiveConnection{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockActiveConnection is an autogenerated mock type for the ActiveConnection type // MockActiveConnection is an autogenerated mock type for the ActiveConnection type
type MockActiveConnection struct { type MockActiveConnection struct {
mock.Mock mock.Mock
@@ -37,20 +22,21 @@ func (_m *MockActiveConnection) EXPECT() *MockActiveConnection_Expecter {
return &MockActiveConnection_Expecter{mock: &_m.Mock} return &MockActiveConnection_Expecter{mock: &_m.Mock}
} }
// GetPath provides a mock function for the type MockActiveConnection // GetPath provides a mock function with no fields
func (_mock *MockActiveConnection) GetPath() dbus.ObjectPath { func (_m *MockActiveConnection) GetPath() dbus.ObjectPath {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPath") panic("no return value specified for GetPath")
} }
var r0 dbus.ObjectPath var r0 dbus.ObjectPath
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok { if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(dbus.ObjectPath) r0 = ret.Get(0).(dbus.ObjectPath)
} }
return r0 return r0
} }
@@ -71,8 +57,8 @@ func (_c *MockActiveConnection_GetPath_Call) Run(run func()) *MockActiveConnecti
return _c return _c
} }
func (_c *MockActiveConnection_GetPath_Call) Return(objectPath dbus.ObjectPath) *MockActiveConnection_GetPath_Call { func (_c *MockActiveConnection_GetPath_Call) Return(_a0 dbus.ObjectPath) *MockActiveConnection_GetPath_Call {
_c.Call.Return(objectPath) _c.Call.Return(_a0)
return _c return _c
} }
@@ -81,9 +67,9 @@ func (_c *MockActiveConnection_GetPath_Call) RunAndReturn(run func() dbus.Object
return _c return _c
} }
// GetPropertyConnection provides a mock function for the type MockActiveConnection // GetPropertyConnection provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyConnection() (gonetworkmanager.Connection, error) { func (_m *MockActiveConnection) GetPropertyConnection() (gonetworkmanager.Connection, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyConnection") panic("no return value specified for GetPropertyConnection")
@@ -91,21 +77,23 @@ func (_mock *MockActiveConnection) GetPropertyConnection() (gonetworkmanager.Con
var r0 gonetworkmanager.Connection var r0 gonetworkmanager.Connection
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.Connection, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.Connection, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.Connection); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.Connection); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.Connection) r0 = ret.Get(0).(gonetworkmanager.Connection)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -126,8 +114,8 @@ func (_c *MockActiveConnection_GetPropertyConnection_Call) Run(run func()) *Mock
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyConnection_Call) Return(connection gonetworkmanager.Connection, err error) *MockActiveConnection_GetPropertyConnection_Call { func (_c *MockActiveConnection_GetPropertyConnection_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockActiveConnection_GetPropertyConnection_Call {
_c.Call.Return(connection, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -136,9 +124,9 @@ func (_c *MockActiveConnection_GetPropertyConnection_Call) RunAndReturn(run func
return _c return _c
} }
// GetPropertyDHCP4Config provides a mock function for the type MockActiveConnection // GetPropertyDHCP4Config provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyDHCP4Config() (gonetworkmanager.DHCP4Config, error) { func (_m *MockActiveConnection) GetPropertyDHCP4Config() (gonetworkmanager.DHCP4Config, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDHCP4Config") panic("no return value specified for GetPropertyDHCP4Config")
@@ -146,21 +134,23 @@ func (_mock *MockActiveConnection) GetPropertyDHCP4Config() (gonetworkmanager.DH
var r0 gonetworkmanager.DHCP4Config var r0 gonetworkmanager.DHCP4Config
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.DHCP4Config, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.DHCP4Config, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.DHCP4Config); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.DHCP4Config); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.DHCP4Config) r0 = ret.Get(0).(gonetworkmanager.DHCP4Config)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -181,8 +171,8 @@ func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) Run(run func()) *Moc
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) Return(dHCP4Config gonetworkmanager.DHCP4Config, err error) *MockActiveConnection_GetPropertyDHCP4Config_Call { func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) Return(_a0 gonetworkmanager.DHCP4Config, _a1 error) *MockActiveConnection_GetPropertyDHCP4Config_Call {
_c.Call.Return(dHCP4Config, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -191,9 +181,9 @@ func (_c *MockActiveConnection_GetPropertyDHCP4Config_Call) RunAndReturn(run fun
return _c return _c
} }
// GetPropertyDHCP6Config provides a mock function for the type MockActiveConnection // GetPropertyDHCP6Config provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyDHCP6Config() (gonetworkmanager.DHCP6Config, error) { func (_m *MockActiveConnection) GetPropertyDHCP6Config() (gonetworkmanager.DHCP6Config, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDHCP6Config") panic("no return value specified for GetPropertyDHCP6Config")
@@ -201,21 +191,23 @@ func (_mock *MockActiveConnection) GetPropertyDHCP6Config() (gonetworkmanager.DH
var r0 gonetworkmanager.DHCP6Config var r0 gonetworkmanager.DHCP6Config
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.DHCP6Config, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.DHCP6Config, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.DHCP6Config); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.DHCP6Config); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.DHCP6Config) r0 = ret.Get(0).(gonetworkmanager.DHCP6Config)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -236,8 +228,8 @@ func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) Run(run func()) *Moc
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) Return(dHCP6Config gonetworkmanager.DHCP6Config, err error) *MockActiveConnection_GetPropertyDHCP6Config_Call { func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) Return(_a0 gonetworkmanager.DHCP6Config, _a1 error) *MockActiveConnection_GetPropertyDHCP6Config_Call {
_c.Call.Return(dHCP6Config, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -246,9 +238,9 @@ func (_c *MockActiveConnection_GetPropertyDHCP6Config_Call) RunAndReturn(run fun
return _c return _c
} }
// GetPropertyDefault provides a mock function for the type MockActiveConnection // GetPropertyDefault provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyDefault() (bool, error) { func (_m *MockActiveConnection) GetPropertyDefault() (bool, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDefault") panic("no return value specified for GetPropertyDefault")
@@ -256,19 +248,21 @@ func (_mock *MockActiveConnection) GetPropertyDefault() (bool, error) {
var r0 bool var r0 bool
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok { if rf, ok := ret.Get(0).(func() (bool, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() bool); ok { if rf, ok := ret.Get(0).(func() bool); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -289,8 +283,8 @@ func (_c *MockActiveConnection_GetPropertyDefault_Call) Run(run func()) *MockAct
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyDefault_Call) Return(b bool, err error) *MockActiveConnection_GetPropertyDefault_Call { func (_c *MockActiveConnection_GetPropertyDefault_Call) Return(_a0 bool, _a1 error) *MockActiveConnection_GetPropertyDefault_Call {
_c.Call.Return(b, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -299,9 +293,9 @@ func (_c *MockActiveConnection_GetPropertyDefault_Call) RunAndReturn(run func()
return _c return _c
} }
// GetPropertyDefault6 provides a mock function for the type MockActiveConnection // GetPropertyDefault6 provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyDefault6() (bool, error) { func (_m *MockActiveConnection) GetPropertyDefault6() (bool, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDefault6") panic("no return value specified for GetPropertyDefault6")
@@ -309,19 +303,21 @@ func (_mock *MockActiveConnection) GetPropertyDefault6() (bool, error) {
var r0 bool var r0 bool
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok { if rf, ok := ret.Get(0).(func() (bool, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() bool); ok { if rf, ok := ret.Get(0).(func() bool); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -342,8 +338,8 @@ func (_c *MockActiveConnection_GetPropertyDefault6_Call) Run(run func()) *MockAc
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyDefault6_Call) Return(b bool, err error) *MockActiveConnection_GetPropertyDefault6_Call { func (_c *MockActiveConnection_GetPropertyDefault6_Call) Return(_a0 bool, _a1 error) *MockActiveConnection_GetPropertyDefault6_Call {
_c.Call.Return(b, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -352,9 +348,9 @@ func (_c *MockActiveConnection_GetPropertyDefault6_Call) RunAndReturn(run func()
return _c return _c
} }
// GetPropertyDevices provides a mock function for the type MockActiveConnection // GetPropertyDevices provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyDevices() ([]gonetworkmanager.Device, error) { func (_m *MockActiveConnection) GetPropertyDevices() ([]gonetworkmanager.Device, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDevices") panic("no return value specified for GetPropertyDevices")
@@ -362,21 +358,23 @@ func (_mock *MockActiveConnection) GetPropertyDevices() ([]gonetworkmanager.Devi
var r0 []gonetworkmanager.Device var r0 []gonetworkmanager.Device
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.Device, error)); ok { if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.Device, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.Device); ok { if rf, ok := ret.Get(0).(func() []gonetworkmanager.Device); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]gonetworkmanager.Device) r0 = ret.Get(0).([]gonetworkmanager.Device)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -397,8 +395,8 @@ func (_c *MockActiveConnection_GetPropertyDevices_Call) Run(run func()) *MockAct
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyDevices_Call) Return(devices []gonetworkmanager.Device, err error) *MockActiveConnection_GetPropertyDevices_Call { func (_c *MockActiveConnection_GetPropertyDevices_Call) Return(_a0 []gonetworkmanager.Device, _a1 error) *MockActiveConnection_GetPropertyDevices_Call {
_c.Call.Return(devices, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -407,9 +405,9 @@ func (_c *MockActiveConnection_GetPropertyDevices_Call) RunAndReturn(run func()
return _c return _c
} }
// GetPropertyID provides a mock function for the type MockActiveConnection // GetPropertyID provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyID() (string, error) { func (_m *MockActiveConnection) GetPropertyID() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyID") panic("no return value specified for GetPropertyID")
@@ -417,19 +415,21 @@ func (_mock *MockActiveConnection) GetPropertyID() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -450,8 +450,8 @@ func (_c *MockActiveConnection_GetPropertyID_Call) Run(run func()) *MockActiveCo
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyID_Call) Return(s string, err error) *MockActiveConnection_GetPropertyID_Call { func (_c *MockActiveConnection_GetPropertyID_Call) Return(_a0 string, _a1 error) *MockActiveConnection_GetPropertyID_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -460,9 +460,9 @@ func (_c *MockActiveConnection_GetPropertyID_Call) RunAndReturn(run func() (stri
return _c return _c
} }
// GetPropertyIP4Config provides a mock function for the type MockActiveConnection // GetPropertyIP4Config provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyIP4Config() (gonetworkmanager.IP4Config, error) { func (_m *MockActiveConnection) GetPropertyIP4Config() (gonetworkmanager.IP4Config, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyIP4Config") panic("no return value specified for GetPropertyIP4Config")
@@ -470,21 +470,23 @@ func (_mock *MockActiveConnection) GetPropertyIP4Config() (gonetworkmanager.IP4C
var r0 gonetworkmanager.IP4Config var r0 gonetworkmanager.IP4Config
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.IP4Config, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.IP4Config, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.IP4Config); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.IP4Config); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.IP4Config) r0 = ret.Get(0).(gonetworkmanager.IP4Config)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -505,8 +507,8 @@ func (_c *MockActiveConnection_GetPropertyIP4Config_Call) Run(run func()) *MockA
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyIP4Config_Call) Return(iP4Config gonetworkmanager.IP4Config, err error) *MockActiveConnection_GetPropertyIP4Config_Call { func (_c *MockActiveConnection_GetPropertyIP4Config_Call) Return(_a0 gonetworkmanager.IP4Config, _a1 error) *MockActiveConnection_GetPropertyIP4Config_Call {
_c.Call.Return(iP4Config, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -515,9 +517,9 @@ func (_c *MockActiveConnection_GetPropertyIP4Config_Call) RunAndReturn(run func(
return _c return _c
} }
// GetPropertyIP6Config provides a mock function for the type MockActiveConnection // GetPropertyIP6Config provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyIP6Config() (gonetworkmanager.IP6Config, error) { func (_m *MockActiveConnection) GetPropertyIP6Config() (gonetworkmanager.IP6Config, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyIP6Config") panic("no return value specified for GetPropertyIP6Config")
@@ -525,21 +527,23 @@ func (_mock *MockActiveConnection) GetPropertyIP6Config() (gonetworkmanager.IP6C
var r0 gonetworkmanager.IP6Config var r0 gonetworkmanager.IP6Config
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.IP6Config, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.IP6Config, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.IP6Config); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.IP6Config); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.IP6Config) r0 = ret.Get(0).(gonetworkmanager.IP6Config)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -560,8 +564,8 @@ func (_c *MockActiveConnection_GetPropertyIP6Config_Call) Run(run func()) *MockA
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyIP6Config_Call) Return(iP6Config gonetworkmanager.IP6Config, err error) *MockActiveConnection_GetPropertyIP6Config_Call { func (_c *MockActiveConnection_GetPropertyIP6Config_Call) Return(_a0 gonetworkmanager.IP6Config, _a1 error) *MockActiveConnection_GetPropertyIP6Config_Call {
_c.Call.Return(iP6Config, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -570,9 +574,9 @@ func (_c *MockActiveConnection_GetPropertyIP6Config_Call) RunAndReturn(run func(
return _c return _c
} }
// GetPropertyMaster provides a mock function for the type MockActiveConnection // GetPropertyMaster provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyMaster() (gonetworkmanager.Device, error) { func (_m *MockActiveConnection) GetPropertyMaster() (gonetworkmanager.Device, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyMaster") panic("no return value specified for GetPropertyMaster")
@@ -580,21 +584,23 @@ func (_mock *MockActiveConnection) GetPropertyMaster() (gonetworkmanager.Device,
var r0 gonetworkmanager.Device var r0 gonetworkmanager.Device
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.Device, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.Device, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.Device); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.Device); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.Device) r0 = ret.Get(0).(gonetworkmanager.Device)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -615,8 +621,8 @@ func (_c *MockActiveConnection_GetPropertyMaster_Call) Run(run func()) *MockActi
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyMaster_Call) Return(device gonetworkmanager.Device, err error) *MockActiveConnection_GetPropertyMaster_Call { func (_c *MockActiveConnection_GetPropertyMaster_Call) Return(_a0 gonetworkmanager.Device, _a1 error) *MockActiveConnection_GetPropertyMaster_Call {
_c.Call.Return(device, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -625,9 +631,9 @@ func (_c *MockActiveConnection_GetPropertyMaster_Call) RunAndReturn(run func() (
return _c return _c
} }
// GetPropertySpecificObject provides a mock function for the type MockActiveConnection // GetPropertySpecificObject provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertySpecificObject() (gonetworkmanager.AccessPoint, error) { func (_m *MockActiveConnection) GetPropertySpecificObject() (gonetworkmanager.AccessPoint, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertySpecificObject") panic("no return value specified for GetPropertySpecificObject")
@@ -635,21 +641,23 @@ func (_mock *MockActiveConnection) GetPropertySpecificObject() (gonetworkmanager
var r0 gonetworkmanager.AccessPoint var r0 gonetworkmanager.AccessPoint
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.AccessPoint, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.AccessPoint, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.AccessPoint); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.AccessPoint); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.AccessPoint) r0 = ret.Get(0).(gonetworkmanager.AccessPoint)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -670,8 +678,8 @@ func (_c *MockActiveConnection_GetPropertySpecificObject_Call) Run(run func()) *
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertySpecificObject_Call) Return(accessPoint gonetworkmanager.AccessPoint, err error) *MockActiveConnection_GetPropertySpecificObject_Call { func (_c *MockActiveConnection_GetPropertySpecificObject_Call) Return(_a0 gonetworkmanager.AccessPoint, _a1 error) *MockActiveConnection_GetPropertySpecificObject_Call {
_c.Call.Return(accessPoint, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -680,9 +688,9 @@ func (_c *MockActiveConnection_GetPropertySpecificObject_Call) RunAndReturn(run
return _c return _c
} }
// GetPropertyState provides a mock function for the type MockActiveConnection // GetPropertyState provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyState() (gonetworkmanager.NmActiveConnectionState, error) { func (_m *MockActiveConnection) GetPropertyState() (gonetworkmanager.NmActiveConnectionState, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyState") panic("no return value specified for GetPropertyState")
@@ -690,19 +698,21 @@ func (_mock *MockActiveConnection) GetPropertyState() (gonetworkmanager.NmActive
var r0 gonetworkmanager.NmActiveConnectionState var r0 gonetworkmanager.NmActiveConnectionState
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.NmActiveConnectionState, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.NmActiveConnectionState, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.NmActiveConnectionState); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.NmActiveConnectionState); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(gonetworkmanager.NmActiveConnectionState) r0 = ret.Get(0).(gonetworkmanager.NmActiveConnectionState)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -723,8 +733,8 @@ func (_c *MockActiveConnection_GetPropertyState_Call) Run(run func()) *MockActiv
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyState_Call) Return(nmActiveConnectionState gonetworkmanager.NmActiveConnectionState, err error) *MockActiveConnection_GetPropertyState_Call { func (_c *MockActiveConnection_GetPropertyState_Call) Return(_a0 gonetworkmanager.NmActiveConnectionState, _a1 error) *MockActiveConnection_GetPropertyState_Call {
_c.Call.Return(nmActiveConnectionState, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -733,9 +743,9 @@ func (_c *MockActiveConnection_GetPropertyState_Call) RunAndReturn(run func() (g
return _c return _c
} }
// GetPropertyStateFlags provides a mock function for the type MockActiveConnection // GetPropertyStateFlags provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyStateFlags() (uint32, error) { func (_m *MockActiveConnection) GetPropertyStateFlags() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyStateFlags") panic("no return value specified for GetPropertyStateFlags")
@@ -743,19 +753,21 @@ func (_mock *MockActiveConnection) GetPropertyStateFlags() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -776,8 +788,8 @@ func (_c *MockActiveConnection_GetPropertyStateFlags_Call) Run(run func()) *Mock
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyStateFlags_Call) Return(v uint32, err error) *MockActiveConnection_GetPropertyStateFlags_Call { func (_c *MockActiveConnection_GetPropertyStateFlags_Call) Return(_a0 uint32, _a1 error) *MockActiveConnection_GetPropertyStateFlags_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -786,9 +798,9 @@ func (_c *MockActiveConnection_GetPropertyStateFlags_Call) RunAndReturn(run func
return _c return _c
} }
// GetPropertyType provides a mock function for the type MockActiveConnection // GetPropertyType provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyType() (string, error) { func (_m *MockActiveConnection) GetPropertyType() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyType") panic("no return value specified for GetPropertyType")
@@ -796,19 +808,21 @@ func (_mock *MockActiveConnection) GetPropertyType() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -829,8 +843,8 @@ func (_c *MockActiveConnection_GetPropertyType_Call) Run(run func()) *MockActive
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyType_Call) Return(s string, err error) *MockActiveConnection_GetPropertyType_Call { func (_c *MockActiveConnection_GetPropertyType_Call) Return(_a0 string, _a1 error) *MockActiveConnection_GetPropertyType_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -839,9 +853,9 @@ func (_c *MockActiveConnection_GetPropertyType_Call) RunAndReturn(run func() (st
return _c return _c
} }
// GetPropertyUUID provides a mock function for the type MockActiveConnection // GetPropertyUUID provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyUUID() (string, error) { func (_m *MockActiveConnection) GetPropertyUUID() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyUUID") panic("no return value specified for GetPropertyUUID")
@@ -849,19 +863,21 @@ func (_mock *MockActiveConnection) GetPropertyUUID() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -882,8 +898,8 @@ func (_c *MockActiveConnection_GetPropertyUUID_Call) Run(run func()) *MockActive
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyUUID_Call) Return(s string, err error) *MockActiveConnection_GetPropertyUUID_Call { func (_c *MockActiveConnection_GetPropertyUUID_Call) Return(_a0 string, _a1 error) *MockActiveConnection_GetPropertyUUID_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -892,9 +908,9 @@ func (_c *MockActiveConnection_GetPropertyUUID_Call) RunAndReturn(run func() (st
return _c return _c
} }
// GetPropertyVPN provides a mock function for the type MockActiveConnection // GetPropertyVPN provides a mock function with no fields
func (_mock *MockActiveConnection) GetPropertyVPN() (bool, error) { func (_m *MockActiveConnection) GetPropertyVPN() (bool, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyVPN") panic("no return value specified for GetPropertyVPN")
@@ -902,19 +918,21 @@ func (_mock *MockActiveConnection) GetPropertyVPN() (bool, error) {
var r0 bool var r0 bool
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok { if rf, ok := ret.Get(0).(func() (bool, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() bool); ok { if rf, ok := ret.Get(0).(func() bool); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -935,8 +953,8 @@ func (_c *MockActiveConnection_GetPropertyVPN_Call) Run(run func()) *MockActiveC
return _c return _c
} }
func (_c *MockActiveConnection_GetPropertyVPN_Call) Return(b bool, err error) *MockActiveConnection_GetPropertyVPN_Call { func (_c *MockActiveConnection_GetPropertyVPN_Call) Return(_a0 bool, _a1 error) *MockActiveConnection_GetPropertyVPN_Call {
_c.Call.Return(b, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -945,20 +963,21 @@ func (_c *MockActiveConnection_GetPropertyVPN_Call) RunAndReturn(run func() (boo
return _c return _c
} }
// SubscribeState provides a mock function for the type MockActiveConnection // SubscribeState provides a mock function with given fields: receiver, exit
func (_mock *MockActiveConnection) SubscribeState(receiver chan gonetworkmanager.StateChange, exit chan struct{}) error { func (_m *MockActiveConnection) SubscribeState(receiver chan gonetworkmanager.StateChange, exit chan struct{}) error {
ret := _mock.Called(receiver, exit) ret := _m.Called(receiver, exit)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for SubscribeState") panic("no return value specified for SubscribeState")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(chan gonetworkmanager.StateChange, chan struct{}) error); ok { if rf, ok := ret.Get(0).(func(chan gonetworkmanager.StateChange, chan struct{}) error); ok {
r0 = returnFunc(receiver, exit) r0 = rf(receiver, exit)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -970,24 +989,13 @@ type MockActiveConnection_SubscribeState_Call struct {
// SubscribeState is a helper method to define mock.On call // SubscribeState is a helper method to define mock.On call
// - receiver chan gonetworkmanager.StateChange // - receiver chan gonetworkmanager.StateChange
// - exit chan struct{} // - exit chan struct{}
func (_e *MockActiveConnection_Expecter) SubscribeState(receiver any, exit any) *MockActiveConnection_SubscribeState_Call { func (_e *MockActiveConnection_Expecter) SubscribeState(receiver interface{}, exit interface{}) *MockActiveConnection_SubscribeState_Call {
return &MockActiveConnection_SubscribeState_Call{Call: _e.mock.On("SubscribeState", receiver, exit)} return &MockActiveConnection_SubscribeState_Call{Call: _e.mock.On("SubscribeState", receiver, exit)}
} }
func (_c *MockActiveConnection_SubscribeState_Call) Run(run func(receiver chan gonetworkmanager.StateChange, exit chan struct{})) *MockActiveConnection_SubscribeState_Call { func (_c *MockActiveConnection_SubscribeState_Call) Run(run func(receiver chan gonetworkmanager.StateChange, exit chan struct{})) *MockActiveConnection_SubscribeState_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 chan gonetworkmanager.StateChange run(args[0].(chan gonetworkmanager.StateChange), args[1].(chan struct{}))
if args[0] != nil {
arg0 = args[0].(chan gonetworkmanager.StateChange)
}
var arg1 chan struct{}
if args[1] != nil {
arg1 = args[1].(chan struct{})
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
@@ -997,7 +1005,21 @@ func (_c *MockActiveConnection_SubscribeState_Call) Return(err error) *MockActiv
return _c return _c
} }
func (_c *MockActiveConnection_SubscribeState_Call) RunAndReturn(run func(receiver chan gonetworkmanager.StateChange, exit chan struct{}) error) *MockActiveConnection_SubscribeState_Call { func (_c *MockActiveConnection_SubscribeState_Call) RunAndReturn(run func(chan gonetworkmanager.StateChange, chan struct{}) error) *MockActiveConnection_SubscribeState_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockActiveConnection creates a new instance of MockActiveConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockActiveConnection(t interface {
mock.TestingT
Cleanup(func())
}) *MockActiveConnection {
mock := &MockActiveConnection{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,29 +1,14 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package gonetworkmanager package gonetworkmanager
import ( import (
"github.com/Wifx/gonetworkmanager/v2" gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
"github.com/godbus/dbus/v5" dbus "github.com/godbus/dbus/v5"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockConnection creates a new instance of MockConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockConnection(t interface {
mock.TestingT
Cleanup(func())
}) *MockConnection {
mock := &MockConnection{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockConnection is an autogenerated mock type for the Connection type // MockConnection is an autogenerated mock type for the Connection type
type MockConnection struct { type MockConnection struct {
mock.Mock mock.Mock
@@ -37,20 +22,21 @@ func (_m *MockConnection) EXPECT() *MockConnection_Expecter {
return &MockConnection_Expecter{mock: &_m.Mock} return &MockConnection_Expecter{mock: &_m.Mock}
} }
// ClearSecrets provides a mock function for the type MockConnection // ClearSecrets provides a mock function with no fields
func (_mock *MockConnection) ClearSecrets() error { func (_m *MockConnection) ClearSecrets() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for ClearSecrets") panic("no return value specified for ClearSecrets")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -71,8 +57,8 @@ func (_c *MockConnection_ClearSecrets_Call) Run(run func()) *MockConnection_Clea
return _c return _c
} }
func (_c *MockConnection_ClearSecrets_Call) Return(err error) *MockConnection_ClearSecrets_Call { func (_c *MockConnection_ClearSecrets_Call) Return(_a0 error) *MockConnection_ClearSecrets_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -81,20 +67,21 @@ func (_c *MockConnection_ClearSecrets_Call) RunAndReturn(run func() error) *Mock
return _c return _c
} }
// Delete provides a mock function for the type MockConnection // Delete provides a mock function with no fields
func (_mock *MockConnection) Delete() error { func (_m *MockConnection) Delete() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Delete") panic("no return value specified for Delete")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -115,8 +102,8 @@ func (_c *MockConnection_Delete_Call) Run(run func()) *MockConnection_Delete_Cal
return _c return _c
} }
func (_c *MockConnection_Delete_Call) Return(err error) *MockConnection_Delete_Call { func (_c *MockConnection_Delete_Call) Return(_a0 error) *MockConnection_Delete_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -125,20 +112,21 @@ func (_c *MockConnection_Delete_Call) RunAndReturn(run func() error) *MockConnec
return _c return _c
} }
// GetPath provides a mock function for the type MockConnection // GetPath provides a mock function with no fields
func (_mock *MockConnection) GetPath() dbus.ObjectPath { func (_m *MockConnection) GetPath() dbus.ObjectPath {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPath") panic("no return value specified for GetPath")
} }
var r0 dbus.ObjectPath var r0 dbus.ObjectPath
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok { if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(dbus.ObjectPath) r0 = ret.Get(0).(dbus.ObjectPath)
} }
return r0 return r0
} }
@@ -159,8 +147,8 @@ func (_c *MockConnection_GetPath_Call) Run(run func()) *MockConnection_GetPath_C
return _c return _c
} }
func (_c *MockConnection_GetPath_Call) Return(objectPath dbus.ObjectPath) *MockConnection_GetPath_Call { func (_c *MockConnection_GetPath_Call) Return(_a0 dbus.ObjectPath) *MockConnection_GetPath_Call {
_c.Call.Return(objectPath) _c.Call.Return(_a0)
return _c return _c
} }
@@ -169,9 +157,9 @@ func (_c *MockConnection_GetPath_Call) RunAndReturn(run func() dbus.ObjectPath)
return _c return _c
} }
// GetPropertyFilename provides a mock function for the type MockConnection // GetPropertyFilename provides a mock function with no fields
func (_mock *MockConnection) GetPropertyFilename() (string, error) { func (_m *MockConnection) GetPropertyFilename() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyFilename") panic("no return value specified for GetPropertyFilename")
@@ -179,19 +167,21 @@ func (_mock *MockConnection) GetPropertyFilename() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -212,8 +202,8 @@ func (_c *MockConnection_GetPropertyFilename_Call) Run(run func()) *MockConnecti
return _c return _c
} }
func (_c *MockConnection_GetPropertyFilename_Call) Return(s string, err error) *MockConnection_GetPropertyFilename_Call { func (_c *MockConnection_GetPropertyFilename_Call) Return(_a0 string, _a1 error) *MockConnection_GetPropertyFilename_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -222,9 +212,9 @@ func (_c *MockConnection_GetPropertyFilename_Call) RunAndReturn(run func() (stri
return _c return _c
} }
// GetPropertyFlags provides a mock function for the type MockConnection // GetPropertyFlags provides a mock function with no fields
func (_mock *MockConnection) GetPropertyFlags() (uint32, error) { func (_m *MockConnection) GetPropertyFlags() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyFlags") panic("no return value specified for GetPropertyFlags")
@@ -232,19 +222,21 @@ func (_mock *MockConnection) GetPropertyFlags() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -265,8 +257,8 @@ func (_c *MockConnection_GetPropertyFlags_Call) Run(run func()) *MockConnection_
return _c return _c
} }
func (_c *MockConnection_GetPropertyFlags_Call) Return(v uint32, err error) *MockConnection_GetPropertyFlags_Call { func (_c *MockConnection_GetPropertyFlags_Call) Return(_a0 uint32, _a1 error) *MockConnection_GetPropertyFlags_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -275,9 +267,9 @@ func (_c *MockConnection_GetPropertyFlags_Call) RunAndReturn(run func() (uint32,
return _c return _c
} }
// GetPropertyUnsaved provides a mock function for the type MockConnection // GetPropertyUnsaved provides a mock function with no fields
func (_mock *MockConnection) GetPropertyUnsaved() (bool, error) { func (_m *MockConnection) GetPropertyUnsaved() (bool, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyUnsaved") panic("no return value specified for GetPropertyUnsaved")
@@ -285,19 +277,21 @@ func (_mock *MockConnection) GetPropertyUnsaved() (bool, error) {
var r0 bool var r0 bool
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok { if rf, ok := ret.Get(0).(func() (bool, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() bool); ok { if rf, ok := ret.Get(0).(func() bool); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -318,8 +312,8 @@ func (_c *MockConnection_GetPropertyUnsaved_Call) Run(run func()) *MockConnectio
return _c return _c
} }
func (_c *MockConnection_GetPropertyUnsaved_Call) Return(b bool, err error) *MockConnection_GetPropertyUnsaved_Call { func (_c *MockConnection_GetPropertyUnsaved_Call) Return(_a0 bool, _a1 error) *MockConnection_GetPropertyUnsaved_Call {
_c.Call.Return(b, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -328,9 +322,9 @@ func (_c *MockConnection_GetPropertyUnsaved_Call) RunAndReturn(run func() (bool,
return _c return _c
} }
// GetSecrets provides a mock function for the type MockConnection // GetSecrets provides a mock function with given fields: settingName
func (_mock *MockConnection) GetSecrets(settingName string) (gonetworkmanager.ConnectionSettings, error) { func (_m *MockConnection) GetSecrets(settingName string) (gonetworkmanager.ConnectionSettings, error) {
ret := _mock.Called(settingName) ret := _m.Called(settingName)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetSecrets") panic("no return value specified for GetSecrets")
@@ -338,21 +332,23 @@ func (_mock *MockConnection) GetSecrets(settingName string) (gonetworkmanager.Co
var r0 gonetworkmanager.ConnectionSettings var r0 gonetworkmanager.ConnectionSettings
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(string) (gonetworkmanager.ConnectionSettings, error)); ok { if rf, ok := ret.Get(0).(func(string) (gonetworkmanager.ConnectionSettings, error)); ok {
return returnFunc(settingName) return rf(settingName)
} }
if returnFunc, ok := ret.Get(0).(func(string) gonetworkmanager.ConnectionSettings); ok { if rf, ok := ret.Get(0).(func(string) gonetworkmanager.ConnectionSettings); ok {
r0 = returnFunc(settingName) r0 = rf(settingName)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings) r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings)
} }
} }
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
r1 = returnFunc(settingName) if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(settingName)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -363,36 +359,30 @@ type MockConnection_GetSecrets_Call struct {
// GetSecrets is a helper method to define mock.On call // GetSecrets is a helper method to define mock.On call
// - settingName string // - settingName string
func (_e *MockConnection_Expecter) GetSecrets(settingName any) *MockConnection_GetSecrets_Call { func (_e *MockConnection_Expecter) GetSecrets(settingName interface{}) *MockConnection_GetSecrets_Call {
return &MockConnection_GetSecrets_Call{Call: _e.mock.On("GetSecrets", settingName)} return &MockConnection_GetSecrets_Call{Call: _e.mock.On("GetSecrets", settingName)}
} }
func (_c *MockConnection_GetSecrets_Call) Run(run func(settingName string)) *MockConnection_GetSecrets_Call { func (_c *MockConnection_GetSecrets_Call) Run(run func(settingName string)) *MockConnection_GetSecrets_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockConnection_GetSecrets_Call) Return(connectionSettings gonetworkmanager.ConnectionSettings, err error) *MockConnection_GetSecrets_Call { func (_c *MockConnection_GetSecrets_Call) Return(_a0 gonetworkmanager.ConnectionSettings, _a1 error) *MockConnection_GetSecrets_Call {
_c.Call.Return(connectionSettings, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockConnection_GetSecrets_Call) RunAndReturn(run func(settingName string) (gonetworkmanager.ConnectionSettings, error)) *MockConnection_GetSecrets_Call { func (_c *MockConnection_GetSecrets_Call) RunAndReturn(run func(string) (gonetworkmanager.ConnectionSettings, error)) *MockConnection_GetSecrets_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// GetSettings provides a mock function for the type MockConnection // GetSettings provides a mock function with no fields
func (_mock *MockConnection) GetSettings() (gonetworkmanager.ConnectionSettings, error) { func (_m *MockConnection) GetSettings() (gonetworkmanager.ConnectionSettings, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetSettings") panic("no return value specified for GetSettings")
@@ -400,21 +390,23 @@ func (_mock *MockConnection) GetSettings() (gonetworkmanager.ConnectionSettings,
var r0 gonetworkmanager.ConnectionSettings var r0 gonetworkmanager.ConnectionSettings
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (gonetworkmanager.ConnectionSettings, error)); ok { if rf, ok := ret.Get(0).(func() (gonetworkmanager.ConnectionSettings, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() gonetworkmanager.ConnectionSettings); ok { if rf, ok := ret.Get(0).(func() gonetworkmanager.ConnectionSettings); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings) r0 = ret.Get(0).(gonetworkmanager.ConnectionSettings)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -435,8 +427,8 @@ func (_c *MockConnection_GetSettings_Call) Run(run func()) *MockConnection_GetSe
return _c return _c
} }
func (_c *MockConnection_GetSettings_Call) Return(connectionSettings gonetworkmanager.ConnectionSettings, err error) *MockConnection_GetSettings_Call { func (_c *MockConnection_GetSettings_Call) Return(_a0 gonetworkmanager.ConnectionSettings, _a1 error) *MockConnection_GetSettings_Call {
_c.Call.Return(connectionSettings, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -445,9 +437,9 @@ func (_c *MockConnection_GetSettings_Call) RunAndReturn(run func() (gonetworkman
return _c return _c
} }
// MarshalJSON provides a mock function for the type MockConnection // MarshalJSON provides a mock function with no fields
func (_mock *MockConnection) MarshalJSON() ([]byte, error) { func (_m *MockConnection) MarshalJSON() ([]byte, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for MarshalJSON") panic("no return value specified for MarshalJSON")
@@ -455,21 +447,23 @@ func (_mock *MockConnection) MarshalJSON() ([]byte, error) {
var r0 []byte var r0 []byte
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]byte, error)); ok { if rf, ok := ret.Get(0).(func() ([]byte, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []byte); ok { if rf, ok := ret.Get(0).(func() []byte); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]byte) r0 = ret.Get(0).([]byte)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -490,8 +484,8 @@ func (_c *MockConnection_MarshalJSON_Call) Run(run func()) *MockConnection_Marsh
return _c return _c
} }
func (_c *MockConnection_MarshalJSON_Call) Return(bytes []byte, err error) *MockConnection_MarshalJSON_Call { func (_c *MockConnection_MarshalJSON_Call) Return(_a0 []byte, _a1 error) *MockConnection_MarshalJSON_Call {
_c.Call.Return(bytes, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -500,20 +494,21 @@ func (_c *MockConnection_MarshalJSON_Call) RunAndReturn(run func() ([]byte, erro
return _c return _c
} }
// Save provides a mock function for the type MockConnection // Save provides a mock function with no fields
func (_mock *MockConnection) Save() error { func (_m *MockConnection) Save() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Save") panic("no return value specified for Save")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -534,8 +529,8 @@ func (_c *MockConnection_Save_Call) Run(run func()) *MockConnection_Save_Call {
return _c return _c
} }
func (_c *MockConnection_Save_Call) Return(err error) *MockConnection_Save_Call { func (_c *MockConnection_Save_Call) Return(_a0 error) *MockConnection_Save_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -544,20 +539,21 @@ func (_c *MockConnection_Save_Call) RunAndReturn(run func() error) *MockConnecti
return _c return _c
} }
// Update provides a mock function for the type MockConnection // Update provides a mock function with given fields: settings
func (_mock *MockConnection) Update(settings gonetworkmanager.ConnectionSettings) error { func (_m *MockConnection) Update(settings gonetworkmanager.ConnectionSettings) error {
ret := _mock.Called(settings) ret := _m.Called(settings)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Update") panic("no return value specified for Update")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok { if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok {
r0 = returnFunc(settings) r0 = rf(settings)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -568,47 +564,42 @@ type MockConnection_Update_Call struct {
// Update is a helper method to define mock.On call // Update is a helper method to define mock.On call
// - settings gonetworkmanager.ConnectionSettings // - settings gonetworkmanager.ConnectionSettings
func (_e *MockConnection_Expecter) Update(settings any) *MockConnection_Update_Call { func (_e *MockConnection_Expecter) Update(settings interface{}) *MockConnection_Update_Call {
return &MockConnection_Update_Call{Call: _e.mock.On("Update", settings)} return &MockConnection_Update_Call{Call: _e.mock.On("Update", settings)}
} }
func (_c *MockConnection_Update_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_Update_Call { func (_c *MockConnection_Update_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_Update_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 gonetworkmanager.ConnectionSettings run(args[0].(gonetworkmanager.ConnectionSettings))
if args[0] != nil {
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockConnection_Update_Call) Return(err error) *MockConnection_Update_Call { func (_c *MockConnection_Update_Call) Return(_a0 error) *MockConnection_Update_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockConnection_Update_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) error) *MockConnection_Update_Call { func (_c *MockConnection_Update_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) error) *MockConnection_Update_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// UpdateUnsaved provides a mock function for the type MockConnection // UpdateUnsaved provides a mock function with given fields: settings
func (_mock *MockConnection) UpdateUnsaved(settings gonetworkmanager.ConnectionSettings) error { func (_m *MockConnection) UpdateUnsaved(settings gonetworkmanager.ConnectionSettings) error {
ret := _mock.Called(settings) ret := _m.Called(settings)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for UpdateUnsaved") panic("no return value specified for UpdateUnsaved")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok { if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) error); ok {
r0 = returnFunc(settings) r0 = rf(settings)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -619,29 +610,37 @@ type MockConnection_UpdateUnsaved_Call struct {
// UpdateUnsaved is a helper method to define mock.On call // UpdateUnsaved is a helper method to define mock.On call
// - settings gonetworkmanager.ConnectionSettings // - settings gonetworkmanager.ConnectionSettings
func (_e *MockConnection_Expecter) UpdateUnsaved(settings any) *MockConnection_UpdateUnsaved_Call { func (_e *MockConnection_Expecter) UpdateUnsaved(settings interface{}) *MockConnection_UpdateUnsaved_Call {
return &MockConnection_UpdateUnsaved_Call{Call: _e.mock.On("UpdateUnsaved", settings)} return &MockConnection_UpdateUnsaved_Call{Call: _e.mock.On("UpdateUnsaved", settings)}
} }
func (_c *MockConnection_UpdateUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_UpdateUnsaved_Call { func (_c *MockConnection_UpdateUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockConnection_UpdateUnsaved_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 gonetworkmanager.ConnectionSettings run(args[0].(gonetworkmanager.ConnectionSettings))
if args[0] != nil {
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockConnection_UpdateUnsaved_Call) Return(err error) *MockConnection_UpdateUnsaved_Call { func (_c *MockConnection_UpdateUnsaved_Call) Return(_a0 error) *MockConnection_UpdateUnsaved_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockConnection_UpdateUnsaved_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) error) *MockConnection_UpdateUnsaved_Call { func (_c *MockConnection_UpdateUnsaved_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) error) *MockConnection_UpdateUnsaved_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockConnection creates a new instance of MockConnection. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockConnection(t interface {
mock.TestingT
Cleanup(func())
}) *MockConnection {
mock := &MockConnection{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package gonetworkmanager package gonetworkmanager
import ( import (
"github.com/Wifx/gonetworkmanager/v2" gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockIP4Config creates a new instance of MockIP4Config. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockIP4Config(t interface {
mock.TestingT
Cleanup(func())
}) *MockIP4Config {
mock := &MockIP4Config{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockIP4Config is an autogenerated mock type for the IP4Config type // MockIP4Config is an autogenerated mock type for the IP4Config type
type MockIP4Config struct { type MockIP4Config struct {
mock.Mock mock.Mock
@@ -36,9 +20,9 @@ func (_m *MockIP4Config) EXPECT() *MockIP4Config_Expecter {
return &MockIP4Config_Expecter{mock: &_m.Mock} return &MockIP4Config_Expecter{mock: &_m.Mock}
} }
// GetPropertyAddressData provides a mock function for the type MockIP4Config // GetPropertyAddressData provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyAddressData() ([]gonetworkmanager.IP4AddressData, error) { func (_m *MockIP4Config) GetPropertyAddressData() ([]gonetworkmanager.IP4AddressData, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyAddressData") panic("no return value specified for GetPropertyAddressData")
@@ -46,21 +30,23 @@ func (_mock *MockIP4Config) GetPropertyAddressData() ([]gonetworkmanager.IP4Addr
var r0 []gonetworkmanager.IP4AddressData var r0 []gonetworkmanager.IP4AddressData
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4AddressData, error)); ok { if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4AddressData, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4AddressData); ok { if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4AddressData); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]gonetworkmanager.IP4AddressData) r0 = ret.Get(0).([]gonetworkmanager.IP4AddressData)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -81,8 +67,8 @@ func (_c *MockIP4Config_GetPropertyAddressData_Call) Run(run func()) *MockIP4Con
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyAddressData_Call) Return(iP4AddressDatas []gonetworkmanager.IP4AddressData, err error) *MockIP4Config_GetPropertyAddressData_Call { func (_c *MockIP4Config_GetPropertyAddressData_Call) Return(_a0 []gonetworkmanager.IP4AddressData, _a1 error) *MockIP4Config_GetPropertyAddressData_Call {
_c.Call.Return(iP4AddressDatas, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -91,9 +77,9 @@ func (_c *MockIP4Config_GetPropertyAddressData_Call) RunAndReturn(run func() ([]
return _c return _c
} }
// GetPropertyAddresses provides a mock function for the type MockIP4Config // GetPropertyAddresses provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyAddresses() ([]gonetworkmanager.IP4Address, error) { func (_m *MockIP4Config) GetPropertyAddresses() ([]gonetworkmanager.IP4Address, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyAddresses") panic("no return value specified for GetPropertyAddresses")
@@ -101,21 +87,23 @@ func (_mock *MockIP4Config) GetPropertyAddresses() ([]gonetworkmanager.IP4Addres
var r0 []gonetworkmanager.IP4Address var r0 []gonetworkmanager.IP4Address
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Address, error)); ok { if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Address, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4Address); ok { if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4Address); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]gonetworkmanager.IP4Address) r0 = ret.Get(0).([]gonetworkmanager.IP4Address)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -136,8 +124,8 @@ func (_c *MockIP4Config_GetPropertyAddresses_Call) Run(run func()) *MockIP4Confi
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyAddresses_Call) Return(iP4Addresss []gonetworkmanager.IP4Address, err error) *MockIP4Config_GetPropertyAddresses_Call { func (_c *MockIP4Config_GetPropertyAddresses_Call) Return(_a0 []gonetworkmanager.IP4Address, _a1 error) *MockIP4Config_GetPropertyAddresses_Call {
_c.Call.Return(iP4Addresss, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -146,9 +134,9 @@ func (_c *MockIP4Config_GetPropertyAddresses_Call) RunAndReturn(run func() ([]go
return _c return _c
} }
// GetPropertyDnsOptions provides a mock function for the type MockIP4Config // GetPropertyDnsOptions provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyDnsOptions() ([]string, error) { func (_m *MockIP4Config) GetPropertyDnsOptions() ([]string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDnsOptions") panic("no return value specified for GetPropertyDnsOptions")
@@ -156,21 +144,23 @@ func (_mock *MockIP4Config) GetPropertyDnsOptions() ([]string, error) {
var r0 []string var r0 []string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok { if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []string); ok { if rf, ok := ret.Get(0).(func() []string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]string) r0 = ret.Get(0).([]string)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -191,8 +181,8 @@ func (_c *MockIP4Config_GetPropertyDnsOptions_Call) Run(run func()) *MockIP4Conf
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyDnsOptions_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyDnsOptions_Call { func (_c *MockIP4Config_GetPropertyDnsOptions_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyDnsOptions_Call {
_c.Call.Return(strings, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -201,9 +191,9 @@ func (_c *MockIP4Config_GetPropertyDnsOptions_Call) RunAndReturn(run func() ([]s
return _c return _c
} }
// GetPropertyDnsPriority provides a mock function for the type MockIP4Config // GetPropertyDnsPriority provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyDnsPriority() (uint32, error) { func (_m *MockIP4Config) GetPropertyDnsPriority() (uint32, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDnsPriority") panic("no return value specified for GetPropertyDnsPriority")
@@ -211,19 +201,21 @@ func (_mock *MockIP4Config) GetPropertyDnsPriority() (uint32, error) {
var r0 uint32 var r0 uint32
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (uint32, error)); ok { if rf, ok := ret.Get(0).(func() (uint32, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() uint32); ok { if rf, ok := ret.Get(0).(func() uint32); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(uint32) r0 = ret.Get(0).(uint32)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -244,8 +236,8 @@ func (_c *MockIP4Config_GetPropertyDnsPriority_Call) Run(run func()) *MockIP4Con
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyDnsPriority_Call) Return(v uint32, err error) *MockIP4Config_GetPropertyDnsPriority_Call { func (_c *MockIP4Config_GetPropertyDnsPriority_Call) Return(_a0 uint32, _a1 error) *MockIP4Config_GetPropertyDnsPriority_Call {
_c.Call.Return(v, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -254,9 +246,9 @@ func (_c *MockIP4Config_GetPropertyDnsPriority_Call) RunAndReturn(run func() (ui
return _c return _c
} }
// GetPropertyDomains provides a mock function for the type MockIP4Config // GetPropertyDomains provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyDomains() ([]string, error) { func (_m *MockIP4Config) GetPropertyDomains() ([]string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyDomains") panic("no return value specified for GetPropertyDomains")
@@ -264,21 +256,23 @@ func (_mock *MockIP4Config) GetPropertyDomains() ([]string, error) {
var r0 []string var r0 []string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok { if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []string); ok { if rf, ok := ret.Get(0).(func() []string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]string) r0 = ret.Get(0).([]string)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -299,8 +293,8 @@ func (_c *MockIP4Config_GetPropertyDomains_Call) Run(run func()) *MockIP4Config_
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyDomains_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyDomains_Call { func (_c *MockIP4Config_GetPropertyDomains_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyDomains_Call {
_c.Call.Return(strings, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -309,9 +303,9 @@ func (_c *MockIP4Config_GetPropertyDomains_Call) RunAndReturn(run func() ([]stri
return _c return _c
} }
// GetPropertyGateway provides a mock function for the type MockIP4Config // GetPropertyGateway provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyGateway() (string, error) { func (_m *MockIP4Config) GetPropertyGateway() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyGateway") panic("no return value specified for GetPropertyGateway")
@@ -319,19 +313,21 @@ func (_mock *MockIP4Config) GetPropertyGateway() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -352,8 +348,8 @@ func (_c *MockIP4Config_GetPropertyGateway_Call) Run(run func()) *MockIP4Config_
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyGateway_Call) Return(s string, err error) *MockIP4Config_GetPropertyGateway_Call { func (_c *MockIP4Config_GetPropertyGateway_Call) Return(_a0 string, _a1 error) *MockIP4Config_GetPropertyGateway_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -362,9 +358,9 @@ func (_c *MockIP4Config_GetPropertyGateway_Call) RunAndReturn(run func() (string
return _c return _c
} }
// GetPropertyNameserverData provides a mock function for the type MockIP4Config // GetPropertyNameserverData provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyNameserverData() ([]gonetworkmanager.IP4NameserverData, error) { func (_m *MockIP4Config) GetPropertyNameserverData() ([]gonetworkmanager.IP4NameserverData, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyNameserverData") panic("no return value specified for GetPropertyNameserverData")
@@ -372,21 +368,23 @@ func (_mock *MockIP4Config) GetPropertyNameserverData() ([]gonetworkmanager.IP4N
var r0 []gonetworkmanager.IP4NameserverData var r0 []gonetworkmanager.IP4NameserverData
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4NameserverData, error)); ok { if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4NameserverData, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4NameserverData); ok { if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4NameserverData); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]gonetworkmanager.IP4NameserverData) r0 = ret.Get(0).([]gonetworkmanager.IP4NameserverData)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -407,8 +405,8 @@ func (_c *MockIP4Config_GetPropertyNameserverData_Call) Run(run func()) *MockIP4
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyNameserverData_Call) Return(iP4NameserverDatas []gonetworkmanager.IP4NameserverData, err error) *MockIP4Config_GetPropertyNameserverData_Call { func (_c *MockIP4Config_GetPropertyNameserverData_Call) Return(_a0 []gonetworkmanager.IP4NameserverData, _a1 error) *MockIP4Config_GetPropertyNameserverData_Call {
_c.Call.Return(iP4NameserverDatas, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -417,9 +415,9 @@ func (_c *MockIP4Config_GetPropertyNameserverData_Call) RunAndReturn(run func()
return _c return _c
} }
// GetPropertyNameservers provides a mock function for the type MockIP4Config // GetPropertyNameservers provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyNameservers() ([]string, error) { func (_m *MockIP4Config) GetPropertyNameservers() ([]string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyNameservers") panic("no return value specified for GetPropertyNameservers")
@@ -427,21 +425,23 @@ func (_mock *MockIP4Config) GetPropertyNameservers() ([]string, error) {
var r0 []string var r0 []string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok { if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []string); ok { if rf, ok := ret.Get(0).(func() []string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]string) r0 = ret.Get(0).([]string)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -462,8 +462,8 @@ func (_c *MockIP4Config_GetPropertyNameservers_Call) Run(run func()) *MockIP4Con
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyNameservers_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyNameservers_Call { func (_c *MockIP4Config_GetPropertyNameservers_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyNameservers_Call {
_c.Call.Return(strings, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -472,9 +472,9 @@ func (_c *MockIP4Config_GetPropertyNameservers_Call) RunAndReturn(run func() ([]
return _c return _c
} }
// GetPropertyRouteData provides a mock function for the type MockIP4Config // GetPropertyRouteData provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyRouteData() ([]gonetworkmanager.IP4RouteData, error) { func (_m *MockIP4Config) GetPropertyRouteData() ([]gonetworkmanager.IP4RouteData, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyRouteData") panic("no return value specified for GetPropertyRouteData")
@@ -482,21 +482,23 @@ func (_mock *MockIP4Config) GetPropertyRouteData() ([]gonetworkmanager.IP4RouteD
var r0 []gonetworkmanager.IP4RouteData var r0 []gonetworkmanager.IP4RouteData
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4RouteData, error)); ok { if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4RouteData, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4RouteData); ok { if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4RouteData); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]gonetworkmanager.IP4RouteData) r0 = ret.Get(0).([]gonetworkmanager.IP4RouteData)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -517,8 +519,8 @@ func (_c *MockIP4Config_GetPropertyRouteData_Call) Run(run func()) *MockIP4Confi
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyRouteData_Call) Return(iP4RouteDatas []gonetworkmanager.IP4RouteData, err error) *MockIP4Config_GetPropertyRouteData_Call { func (_c *MockIP4Config_GetPropertyRouteData_Call) Return(_a0 []gonetworkmanager.IP4RouteData, _a1 error) *MockIP4Config_GetPropertyRouteData_Call {
_c.Call.Return(iP4RouteDatas, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -527,9 +529,9 @@ func (_c *MockIP4Config_GetPropertyRouteData_Call) RunAndReturn(run func() ([]go
return _c return _c
} }
// GetPropertyRoutes provides a mock function for the type MockIP4Config // GetPropertyRoutes provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyRoutes() ([]gonetworkmanager.IP4Route, error) { func (_m *MockIP4Config) GetPropertyRoutes() ([]gonetworkmanager.IP4Route, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyRoutes") panic("no return value specified for GetPropertyRoutes")
@@ -537,21 +539,23 @@ func (_mock *MockIP4Config) GetPropertyRoutes() ([]gonetworkmanager.IP4Route, er
var r0 []gonetworkmanager.IP4Route var r0 []gonetworkmanager.IP4Route
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Route, error)); ok { if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.IP4Route, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.IP4Route); ok { if rf, ok := ret.Get(0).(func() []gonetworkmanager.IP4Route); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]gonetworkmanager.IP4Route) r0 = ret.Get(0).([]gonetworkmanager.IP4Route)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -572,8 +576,8 @@ func (_c *MockIP4Config_GetPropertyRoutes_Call) Run(run func()) *MockIP4Config_G
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyRoutes_Call) Return(iP4Routes []gonetworkmanager.IP4Route, err error) *MockIP4Config_GetPropertyRoutes_Call { func (_c *MockIP4Config_GetPropertyRoutes_Call) Return(_a0 []gonetworkmanager.IP4Route, _a1 error) *MockIP4Config_GetPropertyRoutes_Call {
_c.Call.Return(iP4Routes, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -582,9 +586,9 @@ func (_c *MockIP4Config_GetPropertyRoutes_Call) RunAndReturn(run func() ([]gonet
return _c return _c
} }
// GetPropertySearches provides a mock function for the type MockIP4Config // GetPropertySearches provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertySearches() ([]string, error) { func (_m *MockIP4Config) GetPropertySearches() ([]string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertySearches") panic("no return value specified for GetPropertySearches")
@@ -592,21 +596,23 @@ func (_mock *MockIP4Config) GetPropertySearches() ([]string, error) {
var r0 []string var r0 []string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok { if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []string); ok { if rf, ok := ret.Get(0).(func() []string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]string) r0 = ret.Get(0).([]string)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -627,8 +633,8 @@ func (_c *MockIP4Config_GetPropertySearches_Call) Run(run func()) *MockIP4Config
return _c return _c
} }
func (_c *MockIP4Config_GetPropertySearches_Call) Return(strings []string, err error) *MockIP4Config_GetPropertySearches_Call { func (_c *MockIP4Config_GetPropertySearches_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertySearches_Call {
_c.Call.Return(strings, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -637,9 +643,9 @@ func (_c *MockIP4Config_GetPropertySearches_Call) RunAndReturn(run func() ([]str
return _c return _c
} }
// GetPropertyWinsServerData provides a mock function for the type MockIP4Config // GetPropertyWinsServerData provides a mock function with no fields
func (_mock *MockIP4Config) GetPropertyWinsServerData() ([]string, error) { func (_m *MockIP4Config) GetPropertyWinsServerData() ([]string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyWinsServerData") panic("no return value specified for GetPropertyWinsServerData")
@@ -647,21 +653,23 @@ func (_mock *MockIP4Config) GetPropertyWinsServerData() ([]string, error) {
var r0 []string var r0 []string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]string, error)); ok { if rf, ok := ret.Get(0).(func() ([]string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []string); ok { if rf, ok := ret.Get(0).(func() []string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]string) r0 = ret.Get(0).([]string)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -682,8 +690,8 @@ func (_c *MockIP4Config_GetPropertyWinsServerData_Call) Run(run func()) *MockIP4
return _c return _c
} }
func (_c *MockIP4Config_GetPropertyWinsServerData_Call) Return(strings []string, err error) *MockIP4Config_GetPropertyWinsServerData_Call { func (_c *MockIP4Config_GetPropertyWinsServerData_Call) Return(_a0 []string, _a1 error) *MockIP4Config_GetPropertyWinsServerData_Call {
_c.Call.Return(strings, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -692,9 +700,9 @@ func (_c *MockIP4Config_GetPropertyWinsServerData_Call) RunAndReturn(run func()
return _c return _c
} }
// MarshalJSON provides a mock function for the type MockIP4Config // MarshalJSON provides a mock function with no fields
func (_mock *MockIP4Config) MarshalJSON() ([]byte, error) { func (_m *MockIP4Config) MarshalJSON() ([]byte, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for MarshalJSON") panic("no return value specified for MarshalJSON")
@@ -702,21 +710,23 @@ func (_mock *MockIP4Config) MarshalJSON() ([]byte, error) {
var r0 []byte var r0 []byte
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]byte, error)); ok { if rf, ok := ret.Get(0).(func() ([]byte, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []byte); ok { if rf, ok := ret.Get(0).(func() []byte); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]byte) r0 = ret.Get(0).([]byte)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -737,8 +747,8 @@ func (_c *MockIP4Config_MarshalJSON_Call) Run(run func()) *MockIP4Config_Marshal
return _c return _c
} }
func (_c *MockIP4Config_MarshalJSON_Call) Return(bytes []byte, err error) *MockIP4Config_MarshalJSON_Call { func (_c *MockIP4Config_MarshalJSON_Call) Return(_a0 []byte, _a1 error) *MockIP4Config_MarshalJSON_Call {
_c.Call.Return(bytes, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -746,3 +756,17 @@ func (_c *MockIP4Config_MarshalJSON_Call) RunAndReturn(run func() ([]byte, error
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockIP4Config creates a new instance of MockIP4Config. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockIP4Config(t interface {
mock.TestingT
Cleanup(func())
}) *MockIP4Config {
mock := &MockIP4Config{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
File diff suppressed because it is too large Load Diff
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package gonetworkmanager package gonetworkmanager
import ( import (
"github.com/Wifx/gonetworkmanager/v2" gonetworkmanager "github.com/Wifx/gonetworkmanager/v2"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockSettings creates a new instance of MockSettings. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockSettings(t interface {
mock.TestingT
Cleanup(func())
}) *MockSettings {
mock := &MockSettings{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockSettings is an autogenerated mock type for the Settings type // MockSettings is an autogenerated mock type for the Settings type
type MockSettings struct { type MockSettings struct {
mock.Mock mock.Mock
@@ -36,9 +20,9 @@ func (_m *MockSettings) EXPECT() *MockSettings_Expecter {
return &MockSettings_Expecter{mock: &_m.Mock} return &MockSettings_Expecter{mock: &_m.Mock}
} }
// AddConnection provides a mock function for the type MockSettings // AddConnection provides a mock function with given fields: settings
func (_mock *MockSettings) AddConnection(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) { func (_m *MockSettings) AddConnection(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) {
ret := _mock.Called(settings) ret := _m.Called(settings)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for AddConnection") panic("no return value specified for AddConnection")
@@ -46,21 +30,23 @@ func (_mock *MockSettings) AddConnection(settings gonetworkmanager.ConnectionSet
var r0 gonetworkmanager.Connection var r0 gonetworkmanager.Connection
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok { if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok {
return returnFunc(settings) return rf(settings)
} }
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok { if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok {
r0 = returnFunc(settings) r0 = rf(settings)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.Connection) r0 = ret.Get(0).(gonetworkmanager.Connection)
} }
} }
if returnFunc, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
r1 = returnFunc(settings) if rf, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
r1 = rf(settings)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -71,36 +57,30 @@ type MockSettings_AddConnection_Call struct {
// AddConnection is a helper method to define mock.On call // AddConnection is a helper method to define mock.On call
// - settings gonetworkmanager.ConnectionSettings // - settings gonetworkmanager.ConnectionSettings
func (_e *MockSettings_Expecter) AddConnection(settings any) *MockSettings_AddConnection_Call { func (_e *MockSettings_Expecter) AddConnection(settings interface{}) *MockSettings_AddConnection_Call {
return &MockSettings_AddConnection_Call{Call: _e.mock.On("AddConnection", settings)} return &MockSettings_AddConnection_Call{Call: _e.mock.On("AddConnection", settings)}
} }
func (_c *MockSettings_AddConnection_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnection_Call { func (_c *MockSettings_AddConnection_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnection_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 gonetworkmanager.ConnectionSettings run(args[0].(gonetworkmanager.ConnectionSettings))
if args[0] != nil {
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockSettings_AddConnection_Call) Return(connection gonetworkmanager.Connection, err error) *MockSettings_AddConnection_Call { func (_c *MockSettings_AddConnection_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockSettings_AddConnection_Call {
_c.Call.Return(connection, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockSettings_AddConnection_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnection_Call { func (_c *MockSettings_AddConnection_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnection_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// AddConnectionUnsaved provides a mock function for the type MockSettings // AddConnectionUnsaved provides a mock function with given fields: settings
func (_mock *MockSettings) AddConnectionUnsaved(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) { func (_m *MockSettings) AddConnectionUnsaved(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error) {
ret := _mock.Called(settings) ret := _m.Called(settings)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for AddConnectionUnsaved") panic("no return value specified for AddConnectionUnsaved")
@@ -108,21 +88,23 @@ func (_mock *MockSettings) AddConnectionUnsaved(settings gonetworkmanager.Connec
var r0 gonetworkmanager.Connection var r0 gonetworkmanager.Connection
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok { if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)); ok {
return returnFunc(settings) return rf(settings)
} }
if returnFunc, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok { if rf, ok := ret.Get(0).(func(gonetworkmanager.ConnectionSettings) gonetworkmanager.Connection); ok {
r0 = returnFunc(settings) r0 = rf(settings)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.Connection) r0 = ret.Get(0).(gonetworkmanager.Connection)
} }
} }
if returnFunc, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
r1 = returnFunc(settings) if rf, ok := ret.Get(1).(func(gonetworkmanager.ConnectionSettings) error); ok {
r1 = rf(settings)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -133,36 +115,30 @@ type MockSettings_AddConnectionUnsaved_Call struct {
// AddConnectionUnsaved is a helper method to define mock.On call // AddConnectionUnsaved is a helper method to define mock.On call
// - settings gonetworkmanager.ConnectionSettings // - settings gonetworkmanager.ConnectionSettings
func (_e *MockSettings_Expecter) AddConnectionUnsaved(settings any) *MockSettings_AddConnectionUnsaved_Call { func (_e *MockSettings_Expecter) AddConnectionUnsaved(settings interface{}) *MockSettings_AddConnectionUnsaved_Call {
return &MockSettings_AddConnectionUnsaved_Call{Call: _e.mock.On("AddConnectionUnsaved", settings)} return &MockSettings_AddConnectionUnsaved_Call{Call: _e.mock.On("AddConnectionUnsaved", settings)}
} }
func (_c *MockSettings_AddConnectionUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnectionUnsaved_Call { func (_c *MockSettings_AddConnectionUnsaved_Call) Run(run func(settings gonetworkmanager.ConnectionSettings)) *MockSettings_AddConnectionUnsaved_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 gonetworkmanager.ConnectionSettings run(args[0].(gonetworkmanager.ConnectionSettings))
if args[0] != nil {
arg0 = args[0].(gonetworkmanager.ConnectionSettings)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockSettings_AddConnectionUnsaved_Call) Return(connection gonetworkmanager.Connection, err error) *MockSettings_AddConnectionUnsaved_Call { func (_c *MockSettings_AddConnectionUnsaved_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockSettings_AddConnectionUnsaved_Call {
_c.Call.Return(connection, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockSettings_AddConnectionUnsaved_Call) RunAndReturn(run func(settings gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnectionUnsaved_Call { func (_c *MockSettings_AddConnectionUnsaved_Call) RunAndReturn(run func(gonetworkmanager.ConnectionSettings) (gonetworkmanager.Connection, error)) *MockSettings_AddConnectionUnsaved_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// GetConnectionByUUID provides a mock function for the type MockSettings // GetConnectionByUUID provides a mock function with given fields: uuid
func (_mock *MockSettings) GetConnectionByUUID(uuid string) (gonetworkmanager.Connection, error) { func (_m *MockSettings) GetConnectionByUUID(uuid string) (gonetworkmanager.Connection, error) {
ret := _mock.Called(uuid) ret := _m.Called(uuid)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetConnectionByUUID") panic("no return value specified for GetConnectionByUUID")
@@ -170,21 +146,23 @@ func (_mock *MockSettings) GetConnectionByUUID(uuid string) (gonetworkmanager.Co
var r0 gonetworkmanager.Connection var r0 gonetworkmanager.Connection
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(string) (gonetworkmanager.Connection, error)); ok { if rf, ok := ret.Get(0).(func(string) (gonetworkmanager.Connection, error)); ok {
return returnFunc(uuid) return rf(uuid)
} }
if returnFunc, ok := ret.Get(0).(func(string) gonetworkmanager.Connection); ok { if rf, ok := ret.Get(0).(func(string) gonetworkmanager.Connection); ok {
r0 = returnFunc(uuid) r0 = rf(uuid)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(gonetworkmanager.Connection) r0 = ret.Get(0).(gonetworkmanager.Connection)
} }
} }
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
r1 = returnFunc(uuid) if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(uuid)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -195,36 +173,30 @@ type MockSettings_GetConnectionByUUID_Call struct {
// GetConnectionByUUID is a helper method to define mock.On call // GetConnectionByUUID is a helper method to define mock.On call
// - uuid string // - uuid string
func (_e *MockSettings_Expecter) GetConnectionByUUID(uuid any) *MockSettings_GetConnectionByUUID_Call { func (_e *MockSettings_Expecter) GetConnectionByUUID(uuid interface{}) *MockSettings_GetConnectionByUUID_Call {
return &MockSettings_GetConnectionByUUID_Call{Call: _e.mock.On("GetConnectionByUUID", uuid)} return &MockSettings_GetConnectionByUUID_Call{Call: _e.mock.On("GetConnectionByUUID", uuid)}
} }
func (_c *MockSettings_GetConnectionByUUID_Call) Run(run func(uuid string)) *MockSettings_GetConnectionByUUID_Call { func (_c *MockSettings_GetConnectionByUUID_Call) Run(run func(uuid string)) *MockSettings_GetConnectionByUUID_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockSettings_GetConnectionByUUID_Call) Return(connection gonetworkmanager.Connection, err error) *MockSettings_GetConnectionByUUID_Call { func (_c *MockSettings_GetConnectionByUUID_Call) Return(_a0 gonetworkmanager.Connection, _a1 error) *MockSettings_GetConnectionByUUID_Call {
_c.Call.Return(connection, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockSettings_GetConnectionByUUID_Call) RunAndReturn(run func(uuid string) (gonetworkmanager.Connection, error)) *MockSettings_GetConnectionByUUID_Call { func (_c *MockSettings_GetConnectionByUUID_Call) RunAndReturn(run func(string) (gonetworkmanager.Connection, error)) *MockSettings_GetConnectionByUUID_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// GetPropertyCanModify provides a mock function for the type MockSettings // GetPropertyCanModify provides a mock function with no fields
func (_mock *MockSettings) GetPropertyCanModify() (bool, error) { func (_m *MockSettings) GetPropertyCanModify() (bool, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyCanModify") panic("no return value specified for GetPropertyCanModify")
@@ -232,19 +204,21 @@ func (_mock *MockSettings) GetPropertyCanModify() (bool, error) {
var r0 bool var r0 bool
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (bool, error)); ok { if rf, ok := ret.Get(0).(func() (bool, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() bool); ok { if rf, ok := ret.Get(0).(func() bool); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -265,8 +239,8 @@ func (_c *MockSettings_GetPropertyCanModify_Call) Run(run func()) *MockSettings_
return _c return _c
} }
func (_c *MockSettings_GetPropertyCanModify_Call) Return(b bool, err error) *MockSettings_GetPropertyCanModify_Call { func (_c *MockSettings_GetPropertyCanModify_Call) Return(_a0 bool, _a1 error) *MockSettings_GetPropertyCanModify_Call {
_c.Call.Return(b, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -275,9 +249,9 @@ func (_c *MockSettings_GetPropertyCanModify_Call) RunAndReturn(run func() (bool,
return _c return _c
} }
// GetPropertyHostname provides a mock function for the type MockSettings // GetPropertyHostname provides a mock function with no fields
func (_mock *MockSettings) GetPropertyHostname() (string, error) { func (_m *MockSettings) GetPropertyHostname() (string, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetPropertyHostname") panic("no return value specified for GetPropertyHostname")
@@ -285,19 +259,21 @@ func (_mock *MockSettings) GetPropertyHostname() (string, error) {
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (string, error)); ok { if rf, ok := ret.Get(0).(func() (string, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -318,8 +294,8 @@ func (_c *MockSettings_GetPropertyHostname_Call) Run(run func()) *MockSettings_G
return _c return _c
} }
func (_c *MockSettings_GetPropertyHostname_Call) Return(s string, err error) *MockSettings_GetPropertyHostname_Call { func (_c *MockSettings_GetPropertyHostname_Call) Return(_a0 string, _a1 error) *MockSettings_GetPropertyHostname_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -328,9 +304,9 @@ func (_c *MockSettings_GetPropertyHostname_Call) RunAndReturn(run func() (string
return _c return _c
} }
// ListConnections provides a mock function for the type MockSettings // ListConnections provides a mock function with no fields
func (_mock *MockSettings) ListConnections() ([]gonetworkmanager.Connection, error) { func (_m *MockSettings) ListConnections() ([]gonetworkmanager.Connection, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for ListConnections") panic("no return value specified for ListConnections")
@@ -338,21 +314,23 @@ func (_mock *MockSettings) ListConnections() ([]gonetworkmanager.Connection, err
var r0 []gonetworkmanager.Connection var r0 []gonetworkmanager.Connection
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() ([]gonetworkmanager.Connection, error)); ok { if rf, ok := ret.Get(0).(func() ([]gonetworkmanager.Connection, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() []gonetworkmanager.Connection); ok { if rf, ok := ret.Get(0).(func() []gonetworkmanager.Connection); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).([]gonetworkmanager.Connection) r0 = ret.Get(0).([]gonetworkmanager.Connection)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -373,8 +351,8 @@ func (_c *MockSettings_ListConnections_Call) Run(run func()) *MockSettings_ListC
return _c return _c
} }
func (_c *MockSettings_ListConnections_Call) Return(connections []gonetworkmanager.Connection, err error) *MockSettings_ListConnections_Call { func (_c *MockSettings_ListConnections_Call) Return(_a0 []gonetworkmanager.Connection, _a1 error) *MockSettings_ListConnections_Call {
_c.Call.Return(connections, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -383,20 +361,21 @@ func (_c *MockSettings_ListConnections_Call) RunAndReturn(run func() ([]gonetwor
return _c return _c
} }
// ReloadConnections provides a mock function for the type MockSettings // ReloadConnections provides a mock function with no fields
func (_mock *MockSettings) ReloadConnections() error { func (_m *MockSettings) ReloadConnections() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for ReloadConnections") panic("no return value specified for ReloadConnections")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -417,8 +396,8 @@ func (_c *MockSettings_ReloadConnections_Call) Run(run func()) *MockSettings_Rel
return _c return _c
} }
func (_c *MockSettings_ReloadConnections_Call) Return(err error) *MockSettings_ReloadConnections_Call { func (_c *MockSettings_ReloadConnections_Call) Return(_a0 error) *MockSettings_ReloadConnections_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -427,20 +406,21 @@ func (_c *MockSettings_ReloadConnections_Call) RunAndReturn(run func() error) *M
return _c return _c
} }
// SaveHostname provides a mock function for the type MockSettings // SaveHostname provides a mock function with given fields: hostname
func (_mock *MockSettings) SaveHostname(hostname string) error { func (_m *MockSettings) SaveHostname(hostname string) error {
ret := _mock.Called(hostname) ret := _m.Called(hostname)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for SaveHostname") panic("no return value specified for SaveHostname")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string) error); ok { if rf, ok := ret.Get(0).(func(string) error); ok {
r0 = returnFunc(hostname) r0 = rf(hostname)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -451,29 +431,37 @@ type MockSettings_SaveHostname_Call struct {
// SaveHostname is a helper method to define mock.On call // SaveHostname is a helper method to define mock.On call
// - hostname string // - hostname string
func (_e *MockSettings_Expecter) SaveHostname(hostname any) *MockSettings_SaveHostname_Call { func (_e *MockSettings_Expecter) SaveHostname(hostname interface{}) *MockSettings_SaveHostname_Call {
return &MockSettings_SaveHostname_Call{Call: _e.mock.On("SaveHostname", hostname)} return &MockSettings_SaveHostname_Call{Call: _e.mock.On("SaveHostname", hostname)}
} }
func (_c *MockSettings_SaveHostname_Call) Run(run func(hostname string)) *MockSettings_SaveHostname_Call { func (_c *MockSettings_SaveHostname_Call) Run(run func(hostname string)) *MockSettings_SaveHostname_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockSettings_SaveHostname_Call) Return(err error) *MockSettings_SaveHostname_Call { func (_c *MockSettings_SaveHostname_Call) Return(_a0 error) *MockSettings_SaveHostname_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockSettings_SaveHostname_Call) RunAndReturn(run func(hostname string) error) *MockSettings_SaveHostname_Call { func (_c *MockSettings_SaveHostname_Call) RunAndReturn(run func(string) error) *MockSettings_SaveHostname_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockSettings creates a new instance of MockSettings. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockSettings(t interface {
mock.TestingT
Cleanup(func())
}) *MockSettings {
mock := &MockSettings{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,30 +1,14 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package dbus package dbus
import ( import (
"context" context "context"
"github.com/godbus/dbus/v5" dbus "github.com/godbus/dbus/v5"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockBusObject creates a new instance of MockBusObject. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockBusObject(t interface {
mock.TestingT
Cleanup(func())
}) *MockBusObject {
mock := &MockBusObject{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockBusObject is an autogenerated mock type for the BusObject type // MockBusObject is an autogenerated mock type for the BusObject type
type MockBusObject struct { type MockBusObject struct {
mock.Mock mock.Mock
@@ -38,30 +22,30 @@ func (_m *MockBusObject) EXPECT() *MockBusObject_Expecter {
return &MockBusObject_Expecter{mock: &_m.Mock} return &MockBusObject_Expecter{mock: &_m.Mock}
} }
// AddMatchSignal provides a mock function for the type MockBusObject // AddMatchSignal provides a mock function with given fields: iface, member, options
func (_mock *MockBusObject) AddMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call { func (_m *MockBusObject) AddMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call {
// dbus.MatchOption _va := make([]interface{}, len(options))
_va := make([]any, len(options))
for _i := range options { for _i := range options {
_va[_i] = options[_i] _va[_i] = options[_i]
} }
var _ca []any var _ca []interface{}
_ca = append(_ca, iface, member) _ca = append(_ca, iface, member)
_ca = append(_ca, _va...) _ca = append(_ca, _va...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for AddMatchSignal") panic("no return value specified for AddMatchSignal")
} }
var r0 *dbus.Call var r0 *dbus.Call
if returnFunc, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok { if rf, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok {
r0 = returnFunc(iface, member, options...) r0 = rf(iface, member, options...)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*dbus.Call) r0 = ret.Get(0).(*dbus.Call)
} }
} }
return r0 return r0
} }
@@ -74,67 +58,54 @@ type MockBusObject_AddMatchSignal_Call struct {
// - iface string // - iface string
// - member string // - member string
// - options ...dbus.MatchOption // - options ...dbus.MatchOption
func (_e *MockBusObject_Expecter) AddMatchSignal(iface any, member any, options ...any) *MockBusObject_AddMatchSignal_Call { func (_e *MockBusObject_Expecter) AddMatchSignal(iface interface{}, member interface{}, options ...interface{}) *MockBusObject_AddMatchSignal_Call {
return &MockBusObject_AddMatchSignal_Call{Call: _e.mock.On("AddMatchSignal", return &MockBusObject_AddMatchSignal_Call{Call: _e.mock.On("AddMatchSignal",
append([]any{iface, member}, options...)...)} append([]interface{}{iface, member}, options...)...)}
} }
func (_c *MockBusObject_AddMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_AddMatchSignal_Call { func (_c *MockBusObject_AddMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_AddMatchSignal_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
var arg2 []dbus.MatchOption
variadicArgs := make([]dbus.MatchOption, len(args)-2) variadicArgs := make([]dbus.MatchOption, len(args)-2)
for i, a := range args[2:] { for i, a := range args[2:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(dbus.MatchOption) variadicArgs[i] = a.(dbus.MatchOption)
} }
} }
arg2 = variadicArgs run(args[0].(string), args[1].(string), variadicArgs...)
run(
arg0,
arg1,
arg2...,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_AddMatchSignal_Call) Return(call *dbus.Call) *MockBusObject_AddMatchSignal_Call { func (_c *MockBusObject_AddMatchSignal_Call) Return(_a0 *dbus.Call) *MockBusObject_AddMatchSignal_Call {
_c.Call.Return(call) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_AddMatchSignal_Call) RunAndReturn(run func(iface string, member string, options ...dbus.MatchOption) *dbus.Call) *MockBusObject_AddMatchSignal_Call { func (_c *MockBusObject_AddMatchSignal_Call) RunAndReturn(run func(string, string, ...dbus.MatchOption) *dbus.Call) *MockBusObject_AddMatchSignal_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// Call provides a mock function for the type MockBusObject // Call provides a mock function with given fields: method, flags, args
func (_mock *MockBusObject) Call(method string, flags dbus.Flags, args ...any) *dbus.Call { func (_m *MockBusObject) Call(method string, flags dbus.Flags, args ...interface{}) *dbus.Call {
var _ca []any var _ca []interface{}
_ca = append(_ca, method, flags) _ca = append(_ca, method, flags)
_ca = append(_ca, args...) _ca = append(_ca, args...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Call") panic("no return value specified for Call")
} }
var r0 *dbus.Call var r0 *dbus.Call
if returnFunc, ok := ret.Get(0).(func(string, dbus.Flags, ...any) *dbus.Call); ok { if rf, ok := ret.Get(0).(func(string, dbus.Flags, ...interface{}) *dbus.Call); ok {
r0 = returnFunc(method, flags, args...) r0 = rf(method, flags, args...)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*dbus.Call) r0 = ret.Get(0).(*dbus.Call)
} }
} }
return r0 return r0
} }
@@ -146,68 +117,55 @@ type MockBusObject_Call_Call struct {
// Call is a helper method to define mock.On call // Call is a helper method to define mock.On call
// - method string // - method string
// - flags dbus.Flags // - flags dbus.Flags
// - args ...any // - args ...interface{}
func (_e *MockBusObject_Expecter) Call(method any, flags any, args ...any) *MockBusObject_Call_Call { func (_e *MockBusObject_Expecter) Call(method interface{}, flags interface{}, args ...interface{}) *MockBusObject_Call_Call {
return &MockBusObject_Call_Call{Call: _e.mock.On("Call", return &MockBusObject_Call_Call{Call: _e.mock.On("Call",
append([]any{method, flags}, args...)...)} append([]interface{}{method, flags}, args...)...)}
} }
func (_c *MockBusObject_Call_Call) Run(run func(method string, flags dbus.Flags, args ...any)) *MockBusObject_Call_Call { func (_c *MockBusObject_Call_Call) Run(run func(method string, flags dbus.Flags, args ...interface{})) *MockBusObject_Call_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string variadicArgs := make([]interface{}, len(args)-2)
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 dbus.Flags
if args[1] != nil {
arg1 = args[1].(dbus.Flags)
}
var arg2 []any
variadicArgs := make([]any, len(args)-2)
for i, a := range args[2:] { for i, a := range args[2:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(any) variadicArgs[i] = a.(interface{})
} }
} }
arg2 = variadicArgs run(args[0].(string), args[1].(dbus.Flags), variadicArgs...)
run(
arg0,
arg1,
arg2...,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_Call_Call) Return(call *dbus.Call) *MockBusObject_Call_Call { func (_c *MockBusObject_Call_Call) Return(_a0 *dbus.Call) *MockBusObject_Call_Call {
_c.Call.Return(call) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_Call_Call) RunAndReturn(run func(method string, flags dbus.Flags, args ...any) *dbus.Call) *MockBusObject_Call_Call { func (_c *MockBusObject_Call_Call) RunAndReturn(run func(string, dbus.Flags, ...interface{}) *dbus.Call) *MockBusObject_Call_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// CallWithContext provides a mock function for the type MockBusObject // CallWithContext provides a mock function with given fields: ctx, method, flags, args
func (_mock *MockBusObject) CallWithContext(ctx context.Context, method string, flags dbus.Flags, args ...any) *dbus.Call { func (_m *MockBusObject) CallWithContext(ctx context.Context, method string, flags dbus.Flags, args ...interface{}) *dbus.Call {
var _ca []any var _ca []interface{}
_ca = append(_ca, ctx, method, flags) _ca = append(_ca, ctx, method, flags)
_ca = append(_ca, args...) _ca = append(_ca, args...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for CallWithContext") panic("no return value specified for CallWithContext")
} }
var r0 *dbus.Call var r0 *dbus.Call
if returnFunc, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, ...any) *dbus.Call); ok { if rf, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, ...interface{}) *dbus.Call); ok {
r0 = returnFunc(ctx, method, flags, args...) r0 = rf(ctx, method, flags, args...)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*dbus.Call) r0 = ret.Get(0).(*dbus.Call)
} }
} }
return r0 return r0
} }
@@ -220,68 +178,50 @@ type MockBusObject_CallWithContext_Call struct {
// - ctx context.Context // - ctx context.Context
// - method string // - method string
// - flags dbus.Flags // - flags dbus.Flags
// - args ...any // - args ...interface{}
func (_e *MockBusObject_Expecter) CallWithContext(ctx any, method any, flags any, args ...any) *MockBusObject_CallWithContext_Call { func (_e *MockBusObject_Expecter) CallWithContext(ctx interface{}, method interface{}, flags interface{}, args ...interface{}) *MockBusObject_CallWithContext_Call {
return &MockBusObject_CallWithContext_Call{Call: _e.mock.On("CallWithContext", return &MockBusObject_CallWithContext_Call{Call: _e.mock.On("CallWithContext",
append([]any{ctx, method, flags}, args...)...)} append([]interface{}{ctx, method, flags}, args...)...)}
} }
func (_c *MockBusObject_CallWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, args ...any)) *MockBusObject_CallWithContext_Call { func (_c *MockBusObject_CallWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, args ...interface{})) *MockBusObject_CallWithContext_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 context.Context variadicArgs := make([]interface{}, len(args)-3)
if args[0] != nil {
arg0 = args[0].(context.Context)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
var arg2 dbus.Flags
if args[2] != nil {
arg2 = args[2].(dbus.Flags)
}
var arg3 []any
variadicArgs := make([]any, len(args)-3)
for i, a := range args[3:] { for i, a := range args[3:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(any) variadicArgs[i] = a.(interface{})
} }
} }
arg3 = variadicArgs run(args[0].(context.Context), args[1].(string), args[2].(dbus.Flags), variadicArgs...)
run(
arg0,
arg1,
arg2,
arg3...,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_CallWithContext_Call) Return(call *dbus.Call) *MockBusObject_CallWithContext_Call { func (_c *MockBusObject_CallWithContext_Call) Return(_a0 *dbus.Call) *MockBusObject_CallWithContext_Call {
_c.Call.Return(call) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_CallWithContext_Call) RunAndReturn(run func(ctx context.Context, method string, flags dbus.Flags, args ...any) *dbus.Call) *MockBusObject_CallWithContext_Call { func (_c *MockBusObject_CallWithContext_Call) RunAndReturn(run func(context.Context, string, dbus.Flags, ...interface{}) *dbus.Call) *MockBusObject_CallWithContext_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// Destination provides a mock function for the type MockBusObject // Destination provides a mock function with no fields
func (_mock *MockBusObject) Destination() string { func (_m *MockBusObject) Destination() string {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Destination") panic("no return value specified for Destination")
} }
var r0 string var r0 string
if returnFunc, ok := ret.Get(0).(func() string); ok { if rf, ok := ret.Get(0).(func() string); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
return r0 return r0
} }
@@ -302,8 +242,8 @@ func (_c *MockBusObject_Destination_Call) Run(run func()) *MockBusObject_Destina
return _c return _c
} }
func (_c *MockBusObject_Destination_Call) Return(s string) *MockBusObject_Destination_Call { func (_c *MockBusObject_Destination_Call) Return(_a0 string) *MockBusObject_Destination_Call {
_c.Call.Return(s) _c.Call.Return(_a0)
return _c return _c
} }
@@ -312,9 +252,9 @@ func (_c *MockBusObject_Destination_Call) RunAndReturn(run func() string) *MockB
return _c return _c
} }
// GetProperty provides a mock function for the type MockBusObject // GetProperty provides a mock function with given fields: p
func (_mock *MockBusObject) GetProperty(p string) (dbus.Variant, error) { func (_m *MockBusObject) GetProperty(p string) (dbus.Variant, error) {
ret := _mock.Called(p) ret := _m.Called(p)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetProperty") panic("no return value specified for GetProperty")
@@ -322,19 +262,21 @@ func (_mock *MockBusObject) GetProperty(p string) (dbus.Variant, error) {
var r0 dbus.Variant var r0 dbus.Variant
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(string) (dbus.Variant, error)); ok { if rf, ok := ret.Get(0).(func(string) (dbus.Variant, error)); ok {
return returnFunc(p) return rf(p)
} }
if returnFunc, ok := ret.Get(0).(func(string) dbus.Variant); ok { if rf, ok := ret.Get(0).(func(string) dbus.Variant); ok {
r0 = returnFunc(p) r0 = rf(p)
} else { } else {
r0 = ret.Get(0).(dbus.Variant) r0 = ret.Get(0).(dbus.Variant)
} }
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
r1 = returnFunc(p) if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(p)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -345,52 +287,47 @@ type MockBusObject_GetProperty_Call struct {
// GetProperty is a helper method to define mock.On call // GetProperty is a helper method to define mock.On call
// - p string // - p string
func (_e *MockBusObject_Expecter) GetProperty(p any) *MockBusObject_GetProperty_Call { func (_e *MockBusObject_Expecter) GetProperty(p interface{}) *MockBusObject_GetProperty_Call {
return &MockBusObject_GetProperty_Call{Call: _e.mock.On("GetProperty", p)} return &MockBusObject_GetProperty_Call{Call: _e.mock.On("GetProperty", p)}
} }
func (_c *MockBusObject_GetProperty_Call) Run(run func(p string)) *MockBusObject_GetProperty_Call { func (_c *MockBusObject_GetProperty_Call) Run(run func(p string)) *MockBusObject_GetProperty_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_GetProperty_Call) Return(variant dbus.Variant, err error) *MockBusObject_GetProperty_Call { func (_c *MockBusObject_GetProperty_Call) Return(_a0 dbus.Variant, _a1 error) *MockBusObject_GetProperty_Call {
_c.Call.Return(variant, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockBusObject_GetProperty_Call) RunAndReturn(run func(p string) (dbus.Variant, error)) *MockBusObject_GetProperty_Call { func (_c *MockBusObject_GetProperty_Call) RunAndReturn(run func(string) (dbus.Variant, error)) *MockBusObject_GetProperty_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// Go provides a mock function for the type MockBusObject // Go provides a mock function with given fields: method, flags, ch, args
func (_mock *MockBusObject) Go(method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call { func (_m *MockBusObject) Go(method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{}) *dbus.Call {
var _ca []any var _ca []interface{}
_ca = append(_ca, method, flags, ch) _ca = append(_ca, method, flags, ch)
_ca = append(_ca, args...) _ca = append(_ca, args...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Go") panic("no return value specified for Go")
} }
var r0 *dbus.Call var r0 *dbus.Call
if returnFunc, ok := ret.Get(0).(func(string, dbus.Flags, chan *dbus.Call, ...any) *dbus.Call); ok { if rf, ok := ret.Get(0).(func(string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call); ok {
r0 = returnFunc(method, flags, ch, args...) r0 = rf(method, flags, ch, args...)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*dbus.Call) r0 = ret.Get(0).(*dbus.Call)
} }
} }
return r0 return r0
} }
@@ -403,73 +340,55 @@ type MockBusObject_Go_Call struct {
// - method string // - method string
// - flags dbus.Flags // - flags dbus.Flags
// - ch chan *dbus.Call // - ch chan *dbus.Call
// - args ...any // - args ...interface{}
func (_e *MockBusObject_Expecter) Go(method any, flags any, ch any, args ...any) *MockBusObject_Go_Call { func (_e *MockBusObject_Expecter) Go(method interface{}, flags interface{}, ch interface{}, args ...interface{}) *MockBusObject_Go_Call {
return &MockBusObject_Go_Call{Call: _e.mock.On("Go", return &MockBusObject_Go_Call{Call: _e.mock.On("Go",
append([]any{method, flags, ch}, args...)...)} append([]interface{}{method, flags, ch}, args...)...)}
} }
func (_c *MockBusObject_Go_Call) Run(run func(method string, flags dbus.Flags, ch chan *dbus.Call, args ...any)) *MockBusObject_Go_Call { func (_c *MockBusObject_Go_Call) Run(run func(method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{})) *MockBusObject_Go_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string variadicArgs := make([]interface{}, len(args)-3)
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 dbus.Flags
if args[1] != nil {
arg1 = args[1].(dbus.Flags)
}
var arg2 chan *dbus.Call
if args[2] != nil {
arg2 = args[2].(chan *dbus.Call)
}
var arg3 []any
variadicArgs := make([]any, len(args)-3)
for i, a := range args[3:] { for i, a := range args[3:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(any) variadicArgs[i] = a.(interface{})
} }
} }
arg3 = variadicArgs run(args[0].(string), args[1].(dbus.Flags), args[2].(chan *dbus.Call), variadicArgs...)
run(
arg0,
arg1,
arg2,
arg3...,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_Go_Call) Return(call *dbus.Call) *MockBusObject_Go_Call { func (_c *MockBusObject_Go_Call) Return(_a0 *dbus.Call) *MockBusObject_Go_Call {
_c.Call.Return(call) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_Go_Call) RunAndReturn(run func(method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call) *MockBusObject_Go_Call { func (_c *MockBusObject_Go_Call) RunAndReturn(run func(string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call) *MockBusObject_Go_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// GoWithContext provides a mock function for the type MockBusObject // GoWithContext provides a mock function with given fields: ctx, method, flags, ch, args
func (_mock *MockBusObject) GoWithContext(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call { func (_m *MockBusObject) GoWithContext(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{}) *dbus.Call {
var _ca []any var _ca []interface{}
_ca = append(_ca, ctx, method, flags, ch) _ca = append(_ca, ctx, method, flags, ch)
_ca = append(_ca, args...) _ca = append(_ca, args...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GoWithContext") panic("no return value specified for GoWithContext")
} }
var r0 *dbus.Call var r0 *dbus.Call
if returnFunc, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, chan *dbus.Call, ...any) *dbus.Call); ok { if rf, ok := ret.Get(0).(func(context.Context, string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call); ok {
r0 = returnFunc(ctx, method, flags, ch, args...) r0 = rf(ctx, method, flags, ch, args...)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*dbus.Call) r0 = ret.Get(0).(*dbus.Call)
} }
} }
return r0 return r0
} }
@@ -483,73 +402,50 @@ type MockBusObject_GoWithContext_Call struct {
// - method string // - method string
// - flags dbus.Flags // - flags dbus.Flags
// - ch chan *dbus.Call // - ch chan *dbus.Call
// - args ...any // - args ...interface{}
func (_e *MockBusObject_Expecter) GoWithContext(ctx any, method any, flags any, ch any, args ...any) *MockBusObject_GoWithContext_Call { func (_e *MockBusObject_Expecter) GoWithContext(ctx interface{}, method interface{}, flags interface{}, ch interface{}, args ...interface{}) *MockBusObject_GoWithContext_Call {
return &MockBusObject_GoWithContext_Call{Call: _e.mock.On("GoWithContext", return &MockBusObject_GoWithContext_Call{Call: _e.mock.On("GoWithContext",
append([]any{ctx, method, flags, ch}, args...)...)} append([]interface{}{ctx, method, flags, ch}, args...)...)}
} }
func (_c *MockBusObject_GoWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...any)) *MockBusObject_GoWithContext_Call { func (_c *MockBusObject_GoWithContext_Call) Run(run func(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...interface{})) *MockBusObject_GoWithContext_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 context.Context variadicArgs := make([]interface{}, len(args)-4)
if args[0] != nil {
arg0 = args[0].(context.Context)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
var arg2 dbus.Flags
if args[2] != nil {
arg2 = args[2].(dbus.Flags)
}
var arg3 chan *dbus.Call
if args[3] != nil {
arg3 = args[3].(chan *dbus.Call)
}
var arg4 []any
variadicArgs := make([]any, len(args)-4)
for i, a := range args[4:] { for i, a := range args[4:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(any) variadicArgs[i] = a.(interface{})
} }
} }
arg4 = variadicArgs run(args[0].(context.Context), args[1].(string), args[2].(dbus.Flags), args[3].(chan *dbus.Call), variadicArgs...)
run(
arg0,
arg1,
arg2,
arg3,
arg4...,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_GoWithContext_Call) Return(call *dbus.Call) *MockBusObject_GoWithContext_Call { func (_c *MockBusObject_GoWithContext_Call) Return(_a0 *dbus.Call) *MockBusObject_GoWithContext_Call {
_c.Call.Return(call) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_GoWithContext_Call) RunAndReturn(run func(ctx context.Context, method string, flags dbus.Flags, ch chan *dbus.Call, args ...any) *dbus.Call) *MockBusObject_GoWithContext_Call { func (_c *MockBusObject_GoWithContext_Call) RunAndReturn(run func(context.Context, string, dbus.Flags, chan *dbus.Call, ...interface{}) *dbus.Call) *MockBusObject_GoWithContext_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// Path provides a mock function for the type MockBusObject // Path provides a mock function with no fields
func (_mock *MockBusObject) Path() dbus.ObjectPath { func (_m *MockBusObject) Path() dbus.ObjectPath {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Path") panic("no return value specified for Path")
} }
var r0 dbus.ObjectPath var r0 dbus.ObjectPath
if returnFunc, ok := ret.Get(0).(func() dbus.ObjectPath); ok { if rf, ok := ret.Get(0).(func() dbus.ObjectPath); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Get(0).(dbus.ObjectPath) r0 = ret.Get(0).(dbus.ObjectPath)
} }
return r0 return r0
} }
@@ -570,8 +466,8 @@ func (_c *MockBusObject_Path_Call) Run(run func()) *MockBusObject_Path_Call {
return _c return _c
} }
func (_c *MockBusObject_Path_Call) Return(objectPath dbus.ObjectPath) *MockBusObject_Path_Call { func (_c *MockBusObject_Path_Call) Return(_a0 dbus.ObjectPath) *MockBusObject_Path_Call {
_c.Call.Return(objectPath) _c.Call.Return(_a0)
return _c return _c
} }
@@ -580,30 +476,30 @@ func (_c *MockBusObject_Path_Call) RunAndReturn(run func() dbus.ObjectPath) *Moc
return _c return _c
} }
// RemoveMatchSignal provides a mock function for the type MockBusObject // RemoveMatchSignal provides a mock function with given fields: iface, member, options
func (_mock *MockBusObject) RemoveMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call { func (_m *MockBusObject) RemoveMatchSignal(iface string, member string, options ...dbus.MatchOption) *dbus.Call {
// dbus.MatchOption _va := make([]interface{}, len(options))
_va := make([]any, len(options))
for _i := range options { for _i := range options {
_va[_i] = options[_i] _va[_i] = options[_i]
} }
var _ca []any var _ca []interface{}
_ca = append(_ca, iface, member) _ca = append(_ca, iface, member)
_ca = append(_ca, _va...) _ca = append(_ca, _va...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for RemoveMatchSignal") panic("no return value specified for RemoveMatchSignal")
} }
var r0 *dbus.Call var r0 *dbus.Call
if returnFunc, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok { if rf, ok := ret.Get(0).(func(string, string, ...dbus.MatchOption) *dbus.Call); ok {
r0 = returnFunc(iface, member, options...) r0 = rf(iface, member, options...)
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*dbus.Call) r0 = ret.Get(0).(*dbus.Call)
} }
} }
return r0 return r0
} }
@@ -616,62 +512,49 @@ type MockBusObject_RemoveMatchSignal_Call struct {
// - iface string // - iface string
// - member string // - member string
// - options ...dbus.MatchOption // - options ...dbus.MatchOption
func (_e *MockBusObject_Expecter) RemoveMatchSignal(iface any, member any, options ...any) *MockBusObject_RemoveMatchSignal_Call { func (_e *MockBusObject_Expecter) RemoveMatchSignal(iface interface{}, member interface{}, options ...interface{}) *MockBusObject_RemoveMatchSignal_Call {
return &MockBusObject_RemoveMatchSignal_Call{Call: _e.mock.On("RemoveMatchSignal", return &MockBusObject_RemoveMatchSignal_Call{Call: _e.mock.On("RemoveMatchSignal",
append([]any{iface, member}, options...)...)} append([]interface{}{iface, member}, options...)...)}
} }
func (_c *MockBusObject_RemoveMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_RemoveMatchSignal_Call { func (_c *MockBusObject_RemoveMatchSignal_Call) Run(run func(iface string, member string, options ...dbus.MatchOption)) *MockBusObject_RemoveMatchSignal_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
var arg2 []dbus.MatchOption
variadicArgs := make([]dbus.MatchOption, len(args)-2) variadicArgs := make([]dbus.MatchOption, len(args)-2)
for i, a := range args[2:] { for i, a := range args[2:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(dbus.MatchOption) variadicArgs[i] = a.(dbus.MatchOption)
} }
} }
arg2 = variadicArgs run(args[0].(string), args[1].(string), variadicArgs...)
run(
arg0,
arg1,
arg2...,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_RemoveMatchSignal_Call) Return(call *dbus.Call) *MockBusObject_RemoveMatchSignal_Call { func (_c *MockBusObject_RemoveMatchSignal_Call) Return(_a0 *dbus.Call) *MockBusObject_RemoveMatchSignal_Call {
_c.Call.Return(call) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_RemoveMatchSignal_Call) RunAndReturn(run func(iface string, member string, options ...dbus.MatchOption) *dbus.Call) *MockBusObject_RemoveMatchSignal_Call { func (_c *MockBusObject_RemoveMatchSignal_Call) RunAndReturn(run func(string, string, ...dbus.MatchOption) *dbus.Call) *MockBusObject_RemoveMatchSignal_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// SetProperty provides a mock function for the type MockBusObject // SetProperty provides a mock function with given fields: p, v
func (_mock *MockBusObject) SetProperty(p string, v any) error { func (_m *MockBusObject) SetProperty(p string, v interface{}) error {
ret := _mock.Called(p, v) ret := _m.Called(p, v)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for SetProperty") panic("no return value specified for SetProperty")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, any) error); ok { if rf, ok := ret.Get(0).(func(string, interface{}) error); ok {
r0 = returnFunc(p, v) r0 = rf(p, v)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -682,53 +565,43 @@ type MockBusObject_SetProperty_Call struct {
// SetProperty is a helper method to define mock.On call // SetProperty is a helper method to define mock.On call
// - p string // - p string
// - v any // - v interface{}
func (_e *MockBusObject_Expecter) SetProperty(p any, v any) *MockBusObject_SetProperty_Call { func (_e *MockBusObject_Expecter) SetProperty(p interface{}, v interface{}) *MockBusObject_SetProperty_Call {
return &MockBusObject_SetProperty_Call{Call: _e.mock.On("SetProperty", p, v)} return &MockBusObject_SetProperty_Call{Call: _e.mock.On("SetProperty", p, v)}
} }
func (_c *MockBusObject_SetProperty_Call) Run(run func(p string, v any)) *MockBusObject_SetProperty_Call { func (_c *MockBusObject_SetProperty_Call) Run(run func(p string, v interface{})) *MockBusObject_SetProperty_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(interface{}))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 any
if args[1] != nil {
arg1 = args[1].(any)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_SetProperty_Call) Return(err error) *MockBusObject_SetProperty_Call { func (_c *MockBusObject_SetProperty_Call) Return(_a0 error) *MockBusObject_SetProperty_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_SetProperty_Call) RunAndReturn(run func(p string, v any) error) *MockBusObject_SetProperty_Call { func (_c *MockBusObject_SetProperty_Call) RunAndReturn(run func(string, interface{}) error) *MockBusObject_SetProperty_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// StoreProperty provides a mock function for the type MockBusObject // StoreProperty provides a mock function with given fields: p, value
func (_mock *MockBusObject) StoreProperty(p string, value any) error { func (_m *MockBusObject) StoreProperty(p string, value interface{}) error {
ret := _mock.Called(p, value) ret := _m.Called(p, value)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for StoreProperty") panic("no return value specified for StoreProperty")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, any) error); ok { if rf, ok := ret.Get(0).(func(string, interface{}) error); ok {
r0 = returnFunc(p, value) r0 = rf(p, value)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -739,35 +612,38 @@ type MockBusObject_StoreProperty_Call struct {
// StoreProperty is a helper method to define mock.On call // StoreProperty is a helper method to define mock.On call
// - p string // - p string
// - value any // - value interface{}
func (_e *MockBusObject_Expecter) StoreProperty(p any, value any) *MockBusObject_StoreProperty_Call { func (_e *MockBusObject_Expecter) StoreProperty(p interface{}, value interface{}) *MockBusObject_StoreProperty_Call {
return &MockBusObject_StoreProperty_Call{Call: _e.mock.On("StoreProperty", p, value)} return &MockBusObject_StoreProperty_Call{Call: _e.mock.On("StoreProperty", p, value)}
} }
func (_c *MockBusObject_StoreProperty_Call) Run(run func(p string, value any)) *MockBusObject_StoreProperty_Call { func (_c *MockBusObject_StoreProperty_Call) Run(run func(p string, value interface{})) *MockBusObject_StoreProperty_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(interface{}))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 any
if args[1] != nil {
arg1 = args[1].(any)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockBusObject_StoreProperty_Call) Return(err error) *MockBusObject_StoreProperty_Call { func (_c *MockBusObject_StoreProperty_Call) Return(_a0 error) *MockBusObject_StoreProperty_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockBusObject_StoreProperty_Call) RunAndReturn(run func(p string, value any) error) *MockBusObject_StoreProperty_Call { func (_c *MockBusObject_StoreProperty_Call) RunAndReturn(run func(string, interface{}) error) *MockBusObject_StoreProperty_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockBusObject creates a new instance of MockBusObject. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockBusObject(t interface {
mock.TestingT
Cleanup(func())
}) *MockBusObject {
mock := &MockBusObject{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,26 +1,8 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package plugins package plugins
import ( import mock "github.com/stretchr/testify/mock"
mock "github.com/stretchr/testify/mock"
)
// NewMockGitClient creates a new instance of MockGitClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockGitClient(t interface {
mock.TestingT
Cleanup(func())
}) *MockGitClient {
mock := &MockGitClient{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockGitClient is an autogenerated mock type for the GitClient type // MockGitClient is an autogenerated mock type for the GitClient type
type MockGitClient struct { type MockGitClient struct {
@@ -35,9 +17,9 @@ func (_m *MockGitClient) EXPECT() *MockGitClient_Expecter {
return &MockGitClient_Expecter{mock: &_m.Mock} return &MockGitClient_Expecter{mock: &_m.Mock}
} }
// HasUpdates provides a mock function for the type MockGitClient // HasUpdates provides a mock function with given fields: path
func (_mock *MockGitClient) HasUpdates(path string) (bool, error) { func (_m *MockGitClient) HasUpdates(path string) (bool, error) {
ret := _mock.Called(path) ret := _m.Called(path)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for HasUpdates") panic("no return value specified for HasUpdates")
@@ -45,19 +27,21 @@ func (_mock *MockGitClient) HasUpdates(path string) (bool, error) {
var r0 bool var r0 bool
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(string) (bool, error)); ok { if rf, ok := ret.Get(0).(func(string) (bool, error)); ok {
return returnFunc(path) return rf(path)
} }
if returnFunc, ok := ret.Get(0).(func(string) bool); ok { if rf, ok := ret.Get(0).(func(string) bool); ok {
r0 = returnFunc(path) r0 = rf(path)
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
r1 = returnFunc(path) if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(path)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -74,41 +58,36 @@ func (_e *MockGitClient_Expecter) HasUpdates(path any) *MockGitClient_HasUpdates
func (_c *MockGitClient_HasUpdates_Call) Run(run func(path string)) *MockGitClient_HasUpdates_Call { func (_c *MockGitClient_HasUpdates_Call) Run(run func(path string)) *MockGitClient_HasUpdates_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockGitClient_HasUpdates_Call) Return(b bool, err error) *MockGitClient_HasUpdates_Call { func (_c *MockGitClient_HasUpdates_Call) Return(_a0 bool, _a1 error) *MockGitClient_HasUpdates_Call {
_c.Call.Return(b, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockGitClient_HasUpdates_Call) RunAndReturn(run func(path string) (bool, error)) *MockGitClient_HasUpdates_Call { func (_c *MockGitClient_HasUpdates_Call) RunAndReturn(run func(string) (bool, error)) *MockGitClient_HasUpdates_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// PlainClone provides a mock function for the type MockGitClient // PlainClone provides a mock function with given fields: path, url
func (_mock *MockGitClient) PlainClone(path string, url string) error { func (_m *MockGitClient) PlainClone(path string, url string) error {
ret := _mock.Called(path, url) ret := _m.Called(path, url)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for PlainClone") panic("no return value specified for PlainClone")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string, string) error); ok { if rf, ok := ret.Get(0).(func(string, string) error); ok {
r0 = returnFunc(path, url) r0 = rf(path, url)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -126,46 +105,36 @@ func (_e *MockGitClient_Expecter) PlainClone(path any, url any) *MockGitClient_P
func (_c *MockGitClient_PlainClone_Call) Run(run func(path string, url string)) *MockGitClient_PlainClone_Call { func (_c *MockGitClient_PlainClone_Call) Run(run func(path string, url string)) *MockGitClient_PlainClone_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string), args[1].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
var arg1 string
if args[1] != nil {
arg1 = args[1].(string)
}
run(
arg0,
arg1,
)
}) })
return _c return _c
} }
func (_c *MockGitClient_PlainClone_Call) Return(err error) *MockGitClient_PlainClone_Call { func (_c *MockGitClient_PlainClone_Call) Return(_a0 error) *MockGitClient_PlainClone_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockGitClient_PlainClone_Call) RunAndReturn(run func(path string, url string) error) *MockGitClient_PlainClone_Call { func (_c *MockGitClient_PlainClone_Call) RunAndReturn(run func(string, string) error) *MockGitClient_PlainClone_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// Pull provides a mock function for the type MockGitClient // Pull provides a mock function with given fields: path
func (_mock *MockGitClient) Pull(path string) error { func (_m *MockGitClient) Pull(path string) error {
ret := _mock.Called(path) ret := _m.Called(path)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Pull") panic("no return value specified for Pull")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(string) error); ok { if rf, ok := ret.Get(0).(func(string) error); ok {
r0 = returnFunc(path) r0 = rf(path)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -182,23 +151,31 @@ func (_e *MockGitClient_Expecter) Pull(path any) *MockGitClient_Pull_Call {
func (_c *MockGitClient_Pull_Call) Run(run func(path string)) *MockGitClient_Pull_Call { func (_c *MockGitClient_Pull_Call) Run(run func(path string)) *MockGitClient_Pull_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockGitClient_Pull_Call) Return(err error) *MockGitClient_Pull_Call { func (_c *MockGitClient_Pull_Call) Return(_a0 error) *MockGitClient_Pull_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockGitClient_Pull_Call) RunAndReturn(run func(path string) error) *MockGitClient_Pull_Call { func (_c *MockGitClient_Pull_Call) RunAndReturn(run func(string) error) *MockGitClient_Pull_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockGitClient creates a new instance of MockGitClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockGitClient(t interface {
mock.TestingT
Cleanup(func())
}) *MockGitClient {
mock := &MockGitClient{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
+103 -124
View File
@@ -1,30 +1,15 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package net package net
import ( import (
"net" net "net"
"time"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
time "time"
) )
// NewMockConn creates a new instance of MockConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockConn(t interface {
mock.TestingT
Cleanup(func())
}) *MockConn {
mock := &MockConn{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockConn is an autogenerated mock type for the Conn type // MockConn is an autogenerated mock type for the Conn type
type MockConn struct { type MockConn struct {
mock.Mock mock.Mock
@@ -38,20 +23,21 @@ func (_m *MockConn) EXPECT() *MockConn_Expecter {
return &MockConn_Expecter{mock: &_m.Mock} return &MockConn_Expecter{mock: &_m.Mock}
} }
// Close provides a mock function for the type MockConn // Close provides a mock function with no fields
func (_mock *MockConn) Close() error { func (_m *MockConn) Close() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Close") panic("no return value specified for Close")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -72,8 +58,8 @@ func (_c *MockConn_Close_Call) Run(run func()) *MockConn_Close_Call {
return _c return _c
} }
func (_c *MockConn_Close_Call) Return(err error) *MockConn_Close_Call { func (_c *MockConn_Close_Call) Return(_a0 error) *MockConn_Close_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -82,22 +68,23 @@ func (_c *MockConn_Close_Call) RunAndReturn(run func() error) *MockConn_Close_Ca
return _c return _c
} }
// LocalAddr provides a mock function for the type MockConn // LocalAddr provides a mock function with no fields
func (_mock *MockConn) LocalAddr() net.Addr { func (_m *MockConn) LocalAddr() net.Addr {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for LocalAddr") panic("no return value specified for LocalAddr")
} }
var r0 net.Addr var r0 net.Addr
if returnFunc, ok := ret.Get(0).(func() net.Addr); ok { if rf, ok := ret.Get(0).(func() net.Addr); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(net.Addr) r0 = ret.Get(0).(net.Addr)
} }
} }
return r0 return r0
} }
@@ -118,8 +105,8 @@ func (_c *MockConn_LocalAddr_Call) Run(run func()) *MockConn_LocalAddr_Call {
return _c return _c
} }
func (_c *MockConn_LocalAddr_Call) Return(addr net.Addr) *MockConn_LocalAddr_Call { func (_c *MockConn_LocalAddr_Call) Return(_a0 net.Addr) *MockConn_LocalAddr_Call {
_c.Call.Return(addr) _c.Call.Return(_a0)
return _c return _c
} }
@@ -128,9 +115,9 @@ func (_c *MockConn_LocalAddr_Call) RunAndReturn(run func() net.Addr) *MockConn_L
return _c return _c
} }
// Read provides a mock function for the type MockConn // Read provides a mock function with given fields: b
func (_mock *MockConn) Read(b []byte) (int, error) { func (_m *MockConn) Read(b []byte) (int, error) {
ret := _mock.Called(b) ret := _m.Called(b)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Read") panic("no return value specified for Read")
@@ -138,19 +125,21 @@ func (_mock *MockConn) Read(b []byte) (int, error) {
var r0 int var r0 int
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func([]byte) (int, error)); ok { if rf, ok := ret.Get(0).(func([]byte) (int, error)); ok {
return returnFunc(b) return rf(b)
} }
if returnFunc, ok := ret.Get(0).(func([]byte) int); ok { if rf, ok := ret.Get(0).(func([]byte) int); ok {
r0 = returnFunc(b) r0 = rf(b)
} else { } else {
r0 = ret.Get(0).(int) r0 = ret.Get(0).(int)
} }
if returnFunc, ok := ret.Get(1).(func([]byte) error); ok {
r1 = returnFunc(b) if rf, ok := ret.Get(1).(func([]byte) error); ok {
r1 = rf(b)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -161,19 +150,13 @@ type MockConn_Read_Call struct {
// Read is a helper method to define mock.On call // Read is a helper method to define mock.On call
// - b []byte // - b []byte
func (_e *MockConn_Expecter) Read(b any) *MockConn_Read_Call { func (_e *MockConn_Expecter) Read(b interface{}) *MockConn_Read_Call {
return &MockConn_Read_Call{Call: _e.mock.On("Read", b)} return &MockConn_Read_Call{Call: _e.mock.On("Read", b)}
} }
func (_c *MockConn_Read_Call) Run(run func(b []byte)) *MockConn_Read_Call { func (_c *MockConn_Read_Call) Run(run func(b []byte)) *MockConn_Read_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 []byte run(args[0].([]byte))
if args[0] != nil {
arg0 = args[0].([]byte)
}
run(
arg0,
)
}) })
return _c return _c
} }
@@ -183,27 +166,28 @@ func (_c *MockConn_Read_Call) Return(n int, err error) *MockConn_Read_Call {
return _c return _c
} }
func (_c *MockConn_Read_Call) RunAndReturn(run func(b []byte) (int, error)) *MockConn_Read_Call { func (_c *MockConn_Read_Call) RunAndReturn(run func([]byte) (int, error)) *MockConn_Read_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// RemoteAddr provides a mock function for the type MockConn // RemoteAddr provides a mock function with no fields
func (_mock *MockConn) RemoteAddr() net.Addr { func (_m *MockConn) RemoteAddr() net.Addr {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for RemoteAddr") panic("no return value specified for RemoteAddr")
} }
var r0 net.Addr var r0 net.Addr
if returnFunc, ok := ret.Get(0).(func() net.Addr); ok { if rf, ok := ret.Get(0).(func() net.Addr); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(net.Addr) r0 = ret.Get(0).(net.Addr)
} }
} }
return r0 return r0
} }
@@ -224,8 +208,8 @@ func (_c *MockConn_RemoteAddr_Call) Run(run func()) *MockConn_RemoteAddr_Call {
return _c return _c
} }
func (_c *MockConn_RemoteAddr_Call) Return(addr net.Addr) *MockConn_RemoteAddr_Call { func (_c *MockConn_RemoteAddr_Call) Return(_a0 net.Addr) *MockConn_RemoteAddr_Call {
_c.Call.Return(addr) _c.Call.Return(_a0)
return _c return _c
} }
@@ -234,20 +218,21 @@ func (_c *MockConn_RemoteAddr_Call) RunAndReturn(run func() net.Addr) *MockConn_
return _c return _c
} }
// SetDeadline provides a mock function for the type MockConn // SetDeadline provides a mock function with given fields: t
func (_mock *MockConn) SetDeadline(t time.Time) error { func (_m *MockConn) SetDeadline(t time.Time) error {
ret := _mock.Called(t) ret := _m.Called(t)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for SetDeadline") panic("no return value specified for SetDeadline")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(time.Time) error); ok { if rf, ok := ret.Get(0).(func(time.Time) error); ok {
r0 = returnFunc(t) r0 = rf(t)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -258,47 +243,42 @@ type MockConn_SetDeadline_Call struct {
// SetDeadline is a helper method to define mock.On call // SetDeadline is a helper method to define mock.On call
// - t time.Time // - t time.Time
func (_e *MockConn_Expecter) SetDeadline(t any) *MockConn_SetDeadline_Call { func (_e *MockConn_Expecter) SetDeadline(t interface{}) *MockConn_SetDeadline_Call {
return &MockConn_SetDeadline_Call{Call: _e.mock.On("SetDeadline", t)} return &MockConn_SetDeadline_Call{Call: _e.mock.On("SetDeadline", t)}
} }
func (_c *MockConn_SetDeadline_Call) Run(run func(t time.Time)) *MockConn_SetDeadline_Call { func (_c *MockConn_SetDeadline_Call) Run(run func(t time.Time)) *MockConn_SetDeadline_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 time.Time run(args[0].(time.Time))
if args[0] != nil {
arg0 = args[0].(time.Time)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockConn_SetDeadline_Call) Return(err error) *MockConn_SetDeadline_Call { func (_c *MockConn_SetDeadline_Call) Return(_a0 error) *MockConn_SetDeadline_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockConn_SetDeadline_Call) RunAndReturn(run func(t time.Time) error) *MockConn_SetDeadline_Call { func (_c *MockConn_SetDeadline_Call) RunAndReturn(run func(time.Time) error) *MockConn_SetDeadline_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// SetReadDeadline provides a mock function for the type MockConn // SetReadDeadline provides a mock function with given fields: t
func (_mock *MockConn) SetReadDeadline(t time.Time) error { func (_m *MockConn) SetReadDeadline(t time.Time) error {
ret := _mock.Called(t) ret := _m.Called(t)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for SetReadDeadline") panic("no return value specified for SetReadDeadline")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(time.Time) error); ok { if rf, ok := ret.Get(0).(func(time.Time) error); ok {
r0 = returnFunc(t) r0 = rf(t)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -309,47 +289,42 @@ type MockConn_SetReadDeadline_Call struct {
// SetReadDeadline is a helper method to define mock.On call // SetReadDeadline is a helper method to define mock.On call
// - t time.Time // - t time.Time
func (_e *MockConn_Expecter) SetReadDeadline(t any) *MockConn_SetReadDeadline_Call { func (_e *MockConn_Expecter) SetReadDeadline(t interface{}) *MockConn_SetReadDeadline_Call {
return &MockConn_SetReadDeadline_Call{Call: _e.mock.On("SetReadDeadline", t)} return &MockConn_SetReadDeadline_Call{Call: _e.mock.On("SetReadDeadline", t)}
} }
func (_c *MockConn_SetReadDeadline_Call) Run(run func(t time.Time)) *MockConn_SetReadDeadline_Call { func (_c *MockConn_SetReadDeadline_Call) Run(run func(t time.Time)) *MockConn_SetReadDeadline_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 time.Time run(args[0].(time.Time))
if args[0] != nil {
arg0 = args[0].(time.Time)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockConn_SetReadDeadline_Call) Return(err error) *MockConn_SetReadDeadline_Call { func (_c *MockConn_SetReadDeadline_Call) Return(_a0 error) *MockConn_SetReadDeadline_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockConn_SetReadDeadline_Call) RunAndReturn(run func(t time.Time) error) *MockConn_SetReadDeadline_Call { func (_c *MockConn_SetReadDeadline_Call) RunAndReturn(run func(time.Time) error) *MockConn_SetReadDeadline_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// SetWriteDeadline provides a mock function for the type MockConn // SetWriteDeadline provides a mock function with given fields: t
func (_mock *MockConn) SetWriteDeadline(t time.Time) error { func (_m *MockConn) SetWriteDeadline(t time.Time) error {
ret := _mock.Called(t) ret := _m.Called(t)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for SetWriteDeadline") panic("no return value specified for SetWriteDeadline")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func(time.Time) error); ok { if rf, ok := ret.Get(0).(func(time.Time) error); ok {
r0 = returnFunc(t) r0 = rf(t)
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -360,36 +335,30 @@ type MockConn_SetWriteDeadline_Call struct {
// SetWriteDeadline is a helper method to define mock.On call // SetWriteDeadline is a helper method to define mock.On call
// - t time.Time // - t time.Time
func (_e *MockConn_Expecter) SetWriteDeadline(t any) *MockConn_SetWriteDeadline_Call { func (_e *MockConn_Expecter) SetWriteDeadline(t interface{}) *MockConn_SetWriteDeadline_Call {
return &MockConn_SetWriteDeadline_Call{Call: _e.mock.On("SetWriteDeadline", t)} return &MockConn_SetWriteDeadline_Call{Call: _e.mock.On("SetWriteDeadline", t)}
} }
func (_c *MockConn_SetWriteDeadline_Call) Run(run func(t time.Time)) *MockConn_SetWriteDeadline_Call { func (_c *MockConn_SetWriteDeadline_Call) Run(run func(t time.Time)) *MockConn_SetWriteDeadline_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 time.Time run(args[0].(time.Time))
if args[0] != nil {
arg0 = args[0].(time.Time)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockConn_SetWriteDeadline_Call) Return(err error) *MockConn_SetWriteDeadline_Call { func (_c *MockConn_SetWriteDeadline_Call) Return(_a0 error) *MockConn_SetWriteDeadline_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockConn_SetWriteDeadline_Call) RunAndReturn(run func(t time.Time) error) *MockConn_SetWriteDeadline_Call { func (_c *MockConn_SetWriteDeadline_Call) RunAndReturn(run func(time.Time) error) *MockConn_SetWriteDeadline_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// Write provides a mock function for the type MockConn // Write provides a mock function with given fields: b
func (_mock *MockConn) Write(b []byte) (int, error) { func (_m *MockConn) Write(b []byte) (int, error) {
ret := _mock.Called(b) ret := _m.Called(b)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Write") panic("no return value specified for Write")
@@ -397,19 +366,21 @@ func (_mock *MockConn) Write(b []byte) (int, error) {
var r0 int var r0 int
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func([]byte) (int, error)); ok { if rf, ok := ret.Get(0).(func([]byte) (int, error)); ok {
return returnFunc(b) return rf(b)
} }
if returnFunc, ok := ret.Get(0).(func([]byte) int); ok { if rf, ok := ret.Get(0).(func([]byte) int); ok {
r0 = returnFunc(b) r0 = rf(b)
} else { } else {
r0 = ret.Get(0).(int) r0 = ret.Get(0).(int)
} }
if returnFunc, ok := ret.Get(1).(func([]byte) error); ok {
r1 = returnFunc(b) if rf, ok := ret.Get(1).(func([]byte) error); ok {
r1 = rf(b)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -420,19 +391,13 @@ type MockConn_Write_Call struct {
// Write is a helper method to define mock.On call // Write is a helper method to define mock.On call
// - b []byte // - b []byte
func (_e *MockConn_Expecter) Write(b any) *MockConn_Write_Call { func (_e *MockConn_Expecter) Write(b interface{}) *MockConn_Write_Call {
return &MockConn_Write_Call{Call: _e.mock.On("Write", b)} return &MockConn_Write_Call{Call: _e.mock.On("Write", b)}
} }
func (_c *MockConn_Write_Call) Run(run func(b []byte)) *MockConn_Write_Call { func (_c *MockConn_Write_Call) Run(run func(b []byte)) *MockConn_Write_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 []byte run(args[0].([]byte))
if args[0] != nil {
arg0 = args[0].([]byte)
}
run(
arg0,
)
}) })
return _c return _c
} }
@@ -442,7 +407,21 @@ func (_c *MockConn_Write_Call) Return(n int, err error) *MockConn_Write_Call {
return _c return _c
} }
func (_c *MockConn_Write_Call) RunAndReturn(run func(b []byte) (int, error)) *MockConn_Write_Call { func (_c *MockConn_Write_Call) RunAndReturn(run func([]byte) (int, error)) *MockConn_Write_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockConn creates a new instance of MockConn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockConn(t interface {
mock.TestingT
Cleanup(func())
}) *MockConn {
mock := &MockConn{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
File diff suppressed because it is too large Load Diff
+66 -88
View File
@@ -1,26 +1,8 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_utils package mocks_utils
import ( import mock "github.com/stretchr/testify/mock"
mock "github.com/stretchr/testify/mock"
)
// NewMockAppChecker creates a new instance of MockAppChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockAppChecker(t interface {
mock.TestingT
Cleanup(func())
}) *MockAppChecker {
mock := &MockAppChecker{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockAppChecker is an autogenerated mock type for the AppChecker type // MockAppChecker is an autogenerated mock type for the AppChecker type
type MockAppChecker struct { type MockAppChecker struct {
@@ -35,27 +17,27 @@ func (_m *MockAppChecker) EXPECT() *MockAppChecker_Expecter {
return &MockAppChecker_Expecter{mock: &_m.Mock} return &MockAppChecker_Expecter{mock: &_m.Mock}
} }
// AnyCommandExists provides a mock function for the type MockAppChecker // AnyCommandExists provides a mock function with given fields: cmds
func (_mock *MockAppChecker) AnyCommandExists(cmds ...string) bool { func (_m *MockAppChecker) AnyCommandExists(cmds ...string) bool {
// string _va := make([]interface{}, len(cmds))
_va := make([]any, len(cmds))
for _i := range cmds { for _i := range cmds {
_va[_i] = cmds[_i] _va[_i] = cmds[_i]
} }
var _ca []any var _ca []interface{}
_ca = append(_ca, _va...) _ca = append(_ca, _va...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for AnyCommandExists") panic("no return value specified for AnyCommandExists")
} }
var r0 bool var r0 bool
if returnFunc, ok := ret.Get(0).(func(...string) bool); ok { if rf, ok := ret.Get(0).(func(...string) bool); ok {
r0 = returnFunc(cmds...) r0 = rf(cmds...)
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
return r0 return r0
} }
@@ -66,59 +48,55 @@ type MockAppChecker_AnyCommandExists_Call struct {
// AnyCommandExists is a helper method to define mock.On call // AnyCommandExists is a helper method to define mock.On call
// - cmds ...string // - cmds ...string
func (_e *MockAppChecker_Expecter) AnyCommandExists(cmds ...any) *MockAppChecker_AnyCommandExists_Call { func (_e *MockAppChecker_Expecter) AnyCommandExists(cmds ...interface{}) *MockAppChecker_AnyCommandExists_Call {
return &MockAppChecker_AnyCommandExists_Call{Call: _e.mock.On("AnyCommandExists", return &MockAppChecker_AnyCommandExists_Call{Call: _e.mock.On("AnyCommandExists",
append([]any{}, cmds...)...)} append([]interface{}{}, cmds...)...)}
} }
func (_c *MockAppChecker_AnyCommandExists_Call) Run(run func(cmds ...string)) *MockAppChecker_AnyCommandExists_Call { func (_c *MockAppChecker_AnyCommandExists_Call) Run(run func(cmds ...string)) *MockAppChecker_AnyCommandExists_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 []string
variadicArgs := make([]string, len(args)-0) variadicArgs := make([]string, len(args)-0)
for i, a := range args[0:] { for i, a := range args[0:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(string) variadicArgs[i] = a.(string)
} }
} }
arg0 = variadicArgs run(variadicArgs...)
run(
arg0...,
)
}) })
return _c return _c
} }
func (_c *MockAppChecker_AnyCommandExists_Call) Return(b bool) *MockAppChecker_AnyCommandExists_Call { func (_c *MockAppChecker_AnyCommandExists_Call) Return(_a0 bool) *MockAppChecker_AnyCommandExists_Call {
_c.Call.Return(b) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockAppChecker_AnyCommandExists_Call) RunAndReturn(run func(cmds ...string) bool) *MockAppChecker_AnyCommandExists_Call { func (_c *MockAppChecker_AnyCommandExists_Call) RunAndReturn(run func(...string) bool) *MockAppChecker_AnyCommandExists_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// AnyFlatpakExists provides a mock function for the type MockAppChecker // AnyFlatpakExists provides a mock function with given fields: flatpaks
func (_mock *MockAppChecker) AnyFlatpakExists(flatpaks ...string) bool { func (_m *MockAppChecker) AnyFlatpakExists(flatpaks ...string) bool {
// string _va := make([]interface{}, len(flatpaks))
_va := make([]any, len(flatpaks))
for _i := range flatpaks { for _i := range flatpaks {
_va[_i] = flatpaks[_i] _va[_i] = flatpaks[_i]
} }
var _ca []any var _ca []interface{}
_ca = append(_ca, _va...) _ca = append(_ca, _va...)
ret := _mock.Called(_ca...) ret := _m.Called(_ca...)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for AnyFlatpakExists") panic("no return value specified for AnyFlatpakExists")
} }
var r0 bool var r0 bool
if returnFunc, ok := ret.Get(0).(func(...string) bool); ok { if rf, ok := ret.Get(0).(func(...string) bool); ok {
r0 = returnFunc(flatpaks...) r0 = rf(flatpaks...)
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
return r0 return r0
} }
@@ -129,52 +107,49 @@ type MockAppChecker_AnyFlatpakExists_Call struct {
// AnyFlatpakExists is a helper method to define mock.On call // AnyFlatpakExists is a helper method to define mock.On call
// - flatpaks ...string // - flatpaks ...string
func (_e *MockAppChecker_Expecter) AnyFlatpakExists(flatpaks ...any) *MockAppChecker_AnyFlatpakExists_Call { func (_e *MockAppChecker_Expecter) AnyFlatpakExists(flatpaks ...interface{}) *MockAppChecker_AnyFlatpakExists_Call {
return &MockAppChecker_AnyFlatpakExists_Call{Call: _e.mock.On("AnyFlatpakExists", return &MockAppChecker_AnyFlatpakExists_Call{Call: _e.mock.On("AnyFlatpakExists",
append([]any{}, flatpaks...)...)} append([]interface{}{}, flatpaks...)...)}
} }
func (_c *MockAppChecker_AnyFlatpakExists_Call) Run(run func(flatpaks ...string)) *MockAppChecker_AnyFlatpakExists_Call { func (_c *MockAppChecker_AnyFlatpakExists_Call) Run(run func(flatpaks ...string)) *MockAppChecker_AnyFlatpakExists_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 []string
variadicArgs := make([]string, len(args)-0) variadicArgs := make([]string, len(args)-0)
for i, a := range args[0:] { for i, a := range args[0:] {
if a != nil { if a != nil {
variadicArgs[i] = a.(string) variadicArgs[i] = a.(string)
} }
} }
arg0 = variadicArgs run(variadicArgs...)
run(
arg0...,
)
}) })
return _c return _c
} }
func (_c *MockAppChecker_AnyFlatpakExists_Call) Return(b bool) *MockAppChecker_AnyFlatpakExists_Call { func (_c *MockAppChecker_AnyFlatpakExists_Call) Return(_a0 bool) *MockAppChecker_AnyFlatpakExists_Call {
_c.Call.Return(b) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockAppChecker_AnyFlatpakExists_Call) RunAndReturn(run func(flatpaks ...string) bool) *MockAppChecker_AnyFlatpakExists_Call { func (_c *MockAppChecker_AnyFlatpakExists_Call) RunAndReturn(run func(...string) bool) *MockAppChecker_AnyFlatpakExists_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// CommandExists provides a mock function for the type MockAppChecker // CommandExists provides a mock function with given fields: cmd
func (_mock *MockAppChecker) CommandExists(cmd string) bool { func (_m *MockAppChecker) CommandExists(cmd string) bool {
ret := _mock.Called(cmd) ret := _m.Called(cmd)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for CommandExists") panic("no return value specified for CommandExists")
} }
var r0 bool var r0 bool
if returnFunc, ok := ret.Get(0).(func(string) bool); ok { if rf, ok := ret.Get(0).(func(string) bool); ok {
r0 = returnFunc(cmd) r0 = rf(cmd)
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
return r0 return r0
} }
@@ -185,47 +160,42 @@ type MockAppChecker_CommandExists_Call struct {
// CommandExists is a helper method to define mock.On call // CommandExists is a helper method to define mock.On call
// - cmd string // - cmd string
func (_e *MockAppChecker_Expecter) CommandExists(cmd any) *MockAppChecker_CommandExists_Call { func (_e *MockAppChecker_Expecter) CommandExists(cmd interface{}) *MockAppChecker_CommandExists_Call {
return &MockAppChecker_CommandExists_Call{Call: _e.mock.On("CommandExists", cmd)} return &MockAppChecker_CommandExists_Call{Call: _e.mock.On("CommandExists", cmd)}
} }
func (_c *MockAppChecker_CommandExists_Call) Run(run func(cmd string)) *MockAppChecker_CommandExists_Call { func (_c *MockAppChecker_CommandExists_Call) Run(run func(cmd string)) *MockAppChecker_CommandExists_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockAppChecker_CommandExists_Call) Return(b bool) *MockAppChecker_CommandExists_Call { func (_c *MockAppChecker_CommandExists_Call) Return(_a0 bool) *MockAppChecker_CommandExists_Call {
_c.Call.Return(b) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockAppChecker_CommandExists_Call) RunAndReturn(run func(cmd string) bool) *MockAppChecker_CommandExists_Call { func (_c *MockAppChecker_CommandExists_Call) RunAndReturn(run func(string) bool) *MockAppChecker_CommandExists_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// FlatpakExists provides a mock function for the type MockAppChecker // FlatpakExists provides a mock function with given fields: name
func (_mock *MockAppChecker) FlatpakExists(name string) bool { func (_m *MockAppChecker) FlatpakExists(name string) bool {
ret := _mock.Called(name) ret := _m.Called(name)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for FlatpakExists") panic("no return value specified for FlatpakExists")
} }
var r0 bool var r0 bool
if returnFunc, ok := ret.Get(0).(func(string) bool); ok { if rf, ok := ret.Get(0).(func(string) bool); ok {
r0 = returnFunc(name) r0 = rf(name)
} else { } else {
r0 = ret.Get(0).(bool) r0 = ret.Get(0).(bool)
} }
return r0 return r0
} }
@@ -236,29 +206,37 @@ type MockAppChecker_FlatpakExists_Call struct {
// FlatpakExists is a helper method to define mock.On call // FlatpakExists is a helper method to define mock.On call
// - name string // - name string
func (_e *MockAppChecker_Expecter) FlatpakExists(name any) *MockAppChecker_FlatpakExists_Call { func (_e *MockAppChecker_Expecter) FlatpakExists(name interface{}) *MockAppChecker_FlatpakExists_Call {
return &MockAppChecker_FlatpakExists_Call{Call: _e.mock.On("FlatpakExists", name)} return &MockAppChecker_FlatpakExists_Call{Call: _e.mock.On("FlatpakExists", name)}
} }
func (_c *MockAppChecker_FlatpakExists_Call) Run(run func(name string)) *MockAppChecker_FlatpakExists_Call { func (_c *MockAppChecker_FlatpakExists_Call) Run(run func(name string)) *MockAppChecker_FlatpakExists_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockAppChecker_FlatpakExists_Call) Return(b bool) *MockAppChecker_FlatpakExists_Call { func (_c *MockAppChecker_FlatpakExists_Call) Return(_a0 bool) *MockAppChecker_FlatpakExists_Call {
_c.Call.Return(b) _c.Call.Return(_a0)
return _c return _c
} }
func (_c *MockAppChecker_FlatpakExists_Call) RunAndReturn(run func(name string) bool) *MockAppChecker_FlatpakExists_Call { func (_c *MockAppChecker_FlatpakExists_Call) RunAndReturn(run func(string) bool) *MockAppChecker_FlatpakExists_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockAppChecker creates a new instance of MockAppChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockAppChecker(t interface {
mock.TestingT
Cleanup(func())
}) *MockAppChecker {
mock := &MockAppChecker{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,26 +1,8 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_version package mocks_version
import ( import mock "github.com/stretchr/testify/mock"
mock "github.com/stretchr/testify/mock"
)
// NewMockVersionFetcher creates a new instance of MockVersionFetcher. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockVersionFetcher(t interface {
mock.TestingT
Cleanup(func())
}) *MockVersionFetcher {
mock := &MockVersionFetcher{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockVersionFetcher is an autogenerated mock type for the VersionFetcher type // MockVersionFetcher is an autogenerated mock type for the VersionFetcher type
type MockVersionFetcher struct { type MockVersionFetcher struct {
@@ -35,9 +17,9 @@ func (_m *MockVersionFetcher) EXPECT() *MockVersionFetcher_Expecter {
return &MockVersionFetcher_Expecter{mock: &_m.Mock} return &MockVersionFetcher_Expecter{mock: &_m.Mock}
} }
// GetCurrentVersion provides a mock function for the type MockVersionFetcher // GetCurrentVersion provides a mock function with given fields: dmsPath
func (_mock *MockVersionFetcher) GetCurrentVersion(dmsPath string) (string, error) { func (_m *MockVersionFetcher) GetCurrentVersion(dmsPath string) (string, error) {
ret := _mock.Called(dmsPath) ret := _m.Called(dmsPath)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetCurrentVersion") panic("no return value specified for GetCurrentVersion")
@@ -45,19 +27,21 @@ func (_mock *MockVersionFetcher) GetCurrentVersion(dmsPath string) (string, erro
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(string) (string, error)); ok { if rf, ok := ret.Get(0).(func(string) (string, error)); ok {
return returnFunc(dmsPath) return rf(dmsPath)
} }
if returnFunc, ok := ret.Get(0).(func(string) string); ok { if rf, ok := ret.Get(0).(func(string) string); ok {
r0 = returnFunc(dmsPath) r0 = rf(dmsPath)
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
r1 = returnFunc(dmsPath) if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(dmsPath)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -68,36 +52,30 @@ type MockVersionFetcher_GetCurrentVersion_Call struct {
// GetCurrentVersion is a helper method to define mock.On call // GetCurrentVersion is a helper method to define mock.On call
// - dmsPath string // - dmsPath string
func (_e *MockVersionFetcher_Expecter) GetCurrentVersion(dmsPath any) *MockVersionFetcher_GetCurrentVersion_Call { func (_e *MockVersionFetcher_Expecter) GetCurrentVersion(dmsPath interface{}) *MockVersionFetcher_GetCurrentVersion_Call {
return &MockVersionFetcher_GetCurrentVersion_Call{Call: _e.mock.On("GetCurrentVersion", dmsPath)} return &MockVersionFetcher_GetCurrentVersion_Call{Call: _e.mock.On("GetCurrentVersion", dmsPath)}
} }
func (_c *MockVersionFetcher_GetCurrentVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetCurrentVersion_Call { func (_c *MockVersionFetcher_GetCurrentVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetCurrentVersion_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockVersionFetcher_GetCurrentVersion_Call) Return(s string, err error) *MockVersionFetcher_GetCurrentVersion_Call { func (_c *MockVersionFetcher_GetCurrentVersion_Call) Return(_a0 string, _a1 error) *MockVersionFetcher_GetCurrentVersion_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockVersionFetcher_GetCurrentVersion_Call) RunAndReturn(run func(dmsPath string) (string, error)) *MockVersionFetcher_GetCurrentVersion_Call { func (_c *MockVersionFetcher_GetCurrentVersion_Call) RunAndReturn(run func(string) (string, error)) *MockVersionFetcher_GetCurrentVersion_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// GetLatestVersion provides a mock function for the type MockVersionFetcher // GetLatestVersion provides a mock function with given fields: dmsPath
func (_mock *MockVersionFetcher) GetLatestVersion(dmsPath string) (string, error) { func (_m *MockVersionFetcher) GetLatestVersion(dmsPath string) (string, error) {
ret := _mock.Called(dmsPath) ret := _m.Called(dmsPath)
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetLatestVersion") panic("no return value specified for GetLatestVersion")
@@ -105,19 +83,21 @@ func (_mock *MockVersionFetcher) GetLatestVersion(dmsPath string) (string, error
var r0 string var r0 string
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func(string) (string, error)); ok { if rf, ok := ret.Get(0).(func(string) (string, error)); ok {
return returnFunc(dmsPath) return rf(dmsPath)
} }
if returnFunc, ok := ret.Get(0).(func(string) string); ok { if rf, ok := ret.Get(0).(func(string) string); ok {
r0 = returnFunc(dmsPath) r0 = rf(dmsPath)
} else { } else {
r0 = ret.Get(0).(string) r0 = ret.Get(0).(string)
} }
if returnFunc, ok := ret.Get(1).(func(string) error); ok {
r1 = returnFunc(dmsPath) if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(dmsPath)
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -128,29 +108,37 @@ type MockVersionFetcher_GetLatestVersion_Call struct {
// GetLatestVersion is a helper method to define mock.On call // GetLatestVersion is a helper method to define mock.On call
// - dmsPath string // - dmsPath string
func (_e *MockVersionFetcher_Expecter) GetLatestVersion(dmsPath any) *MockVersionFetcher_GetLatestVersion_Call { func (_e *MockVersionFetcher_Expecter) GetLatestVersion(dmsPath interface{}) *MockVersionFetcher_GetLatestVersion_Call {
return &MockVersionFetcher_GetLatestVersion_Call{Call: _e.mock.On("GetLatestVersion", dmsPath)} return &MockVersionFetcher_GetLatestVersion_Call{Call: _e.mock.On("GetLatestVersion", dmsPath)}
} }
func (_c *MockVersionFetcher_GetLatestVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetLatestVersion_Call { func (_c *MockVersionFetcher_GetLatestVersion_Call) Run(run func(dmsPath string)) *MockVersionFetcher_GetLatestVersion_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 string run(args[0].(string))
if args[0] != nil {
arg0 = args[0].(string)
}
run(
arg0,
)
}) })
return _c return _c
} }
func (_c *MockVersionFetcher_GetLatestVersion_Call) Return(s string, err error) *MockVersionFetcher_GetLatestVersion_Call { func (_c *MockVersionFetcher_GetLatestVersion_Call) Return(_a0 string, _a1 error) *MockVersionFetcher_GetLatestVersion_Call {
_c.Call.Return(s, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
func (_c *MockVersionFetcher_GetLatestVersion_Call) RunAndReturn(run func(dmsPath string) (string, error)) *MockVersionFetcher_GetLatestVersion_Call { func (_c *MockVersionFetcher_GetLatestVersion_Call) RunAndReturn(run func(string) (string, error)) *MockVersionFetcher_GetLatestVersion_Call {
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockVersionFetcher creates a new instance of MockVersionFetcher. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockVersionFetcher(t interface {
mock.TestingT
Cleanup(func())
}) *MockVersionFetcher {
mock := &MockVersionFetcher{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_wlclient package mocks_wlclient
import ( import (
"github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client" client "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockWaylandDisplay creates a new instance of MockWaylandDisplay. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockWaylandDisplay(t interface {
mock.TestingT
Cleanup(func())
}) *MockWaylandDisplay {
mock := &MockWaylandDisplay{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockWaylandDisplay is an autogenerated mock type for the WaylandDisplay type // MockWaylandDisplay is an autogenerated mock type for the WaylandDisplay type
type MockWaylandDisplay struct { type MockWaylandDisplay struct {
mock.Mock mock.Mock
@@ -36,22 +20,23 @@ func (_m *MockWaylandDisplay) EXPECT() *MockWaylandDisplay_Expecter {
return &MockWaylandDisplay_Expecter{mock: &_m.Mock} return &MockWaylandDisplay_Expecter{mock: &_m.Mock}
} }
// Context provides a mock function for the type MockWaylandDisplay // Context provides a mock function with no fields
func (_mock *MockWaylandDisplay) Context() *client.Context { func (_m *MockWaylandDisplay) Context() *client.Context {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Context") panic("no return value specified for Context")
} }
var r0 *client.Context var r0 *client.Context
if returnFunc, ok := ret.Get(0).(func() *client.Context); ok { if rf, ok := ret.Get(0).(func() *client.Context); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*client.Context) r0 = ret.Get(0).(*client.Context)
} }
} }
return r0 return r0
} }
@@ -72,8 +57,8 @@ func (_c *MockWaylandDisplay_Context_Call) Run(run func()) *MockWaylandDisplay_C
return _c return _c
} }
func (_c *MockWaylandDisplay_Context_Call) Return(context *client.Context) *MockWaylandDisplay_Context_Call { func (_c *MockWaylandDisplay_Context_Call) Return(_a0 *client.Context) *MockWaylandDisplay_Context_Call {
_c.Call.Return(context) _c.Call.Return(_a0)
return _c return _c
} }
@@ -82,20 +67,21 @@ func (_c *MockWaylandDisplay_Context_Call) RunAndReturn(run func() *client.Conte
return _c return _c
} }
// Destroy provides a mock function for the type MockWaylandDisplay // Destroy provides a mock function with no fields
func (_mock *MockWaylandDisplay) Destroy() error { func (_m *MockWaylandDisplay) Destroy() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Destroy") panic("no return value specified for Destroy")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -116,8 +102,8 @@ func (_c *MockWaylandDisplay_Destroy_Call) Run(run func()) *MockWaylandDisplay_D
return _c return _c
} }
func (_c *MockWaylandDisplay_Destroy_Call) Return(err error) *MockWaylandDisplay_Destroy_Call { func (_c *MockWaylandDisplay_Destroy_Call) Return(_a0 error) *MockWaylandDisplay_Destroy_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -126,9 +112,9 @@ func (_c *MockWaylandDisplay_Destroy_Call) RunAndReturn(run func() error) *MockW
return _c return _c
} }
// GetRegistry provides a mock function for the type MockWaylandDisplay // GetRegistry provides a mock function with no fields
func (_mock *MockWaylandDisplay) GetRegistry() (*client.Registry, error) { func (_m *MockWaylandDisplay) GetRegistry() (*client.Registry, error) {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for GetRegistry") panic("no return value specified for GetRegistry")
@@ -136,21 +122,23 @@ func (_mock *MockWaylandDisplay) GetRegistry() (*client.Registry, error) {
var r0 *client.Registry var r0 *client.Registry
var r1 error var r1 error
if returnFunc, ok := ret.Get(0).(func() (*client.Registry, error)); ok { if rf, ok := ret.Get(0).(func() (*client.Registry, error)); ok {
return returnFunc() return rf()
} }
if returnFunc, ok := ret.Get(0).(func() *client.Registry); ok { if rf, ok := ret.Get(0).(func() *client.Registry); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*client.Registry) r0 = ret.Get(0).(*client.Registry)
} }
} }
if returnFunc, ok := ret.Get(1).(func() error); ok {
r1 = returnFunc() if rf, ok := ret.Get(1).(func() error); ok {
r1 = rf()
} else { } else {
r1 = ret.Error(1) r1 = ret.Error(1)
} }
return r0, r1 return r0, r1
} }
@@ -171,8 +159,8 @@ func (_c *MockWaylandDisplay_GetRegistry_Call) Run(run func()) *MockWaylandDispl
return _c return _c
} }
func (_c *MockWaylandDisplay_GetRegistry_Call) Return(registry *client.Registry, err error) *MockWaylandDisplay_GetRegistry_Call { func (_c *MockWaylandDisplay_GetRegistry_Call) Return(_a0 *client.Registry, _a1 error) *MockWaylandDisplay_GetRegistry_Call {
_c.Call.Return(registry, err) _c.Call.Return(_a0, _a1)
return _c return _c
} }
@@ -181,20 +169,21 @@ func (_c *MockWaylandDisplay_GetRegistry_Call) RunAndReturn(run func() (*client.
return _c return _c
} }
// Roundtrip provides a mock function for the type MockWaylandDisplay // Roundtrip provides a mock function with no fields
func (_mock *MockWaylandDisplay) Roundtrip() error { func (_m *MockWaylandDisplay) Roundtrip() error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Roundtrip") panic("no return value specified for Roundtrip")
} }
var r0 error var r0 error
if returnFunc, ok := ret.Get(0).(func() error); ok { if rf, ok := ret.Get(0).(func() error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
r0 = ret.Error(0) r0 = ret.Error(0)
} }
return r0 return r0
} }
@@ -215,8 +204,8 @@ func (_c *MockWaylandDisplay_Roundtrip_Call) Run(run func()) *MockWaylandDisplay
return _c return _c
} }
func (_c *MockWaylandDisplay_Roundtrip_Call) Return(err error) *MockWaylandDisplay_Roundtrip_Call { func (_c *MockWaylandDisplay_Roundtrip_Call) Return(_a0 error) *MockWaylandDisplay_Roundtrip_Call {
_c.Call.Return(err) _c.Call.Return(_a0)
return _c return _c
} }
@@ -224,3 +213,17 @@ func (_c *MockWaylandDisplay_Roundtrip_Call) RunAndReturn(run func() error) *Moc
_c.Call.Return(run) _c.Call.Return(run)
return _c return _c
} }
// NewMockWaylandDisplay creates a new instance of MockWaylandDisplay. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockWaylandDisplay(t interface {
mock.TestingT
Cleanup(func())
}) *MockWaylandDisplay {
mock := &MockWaylandDisplay{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
@@ -1,28 +1,12 @@
// Code generated by mockery; DO NOT EDIT. // Code generated by mockery v2.53.5. DO NOT EDIT.
// github.com/vektra/mockery
// template: testify
package mocks_wlcontext package mocks_wlcontext
import ( import (
"github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client" client "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
mock "github.com/stretchr/testify/mock" mock "github.com/stretchr/testify/mock"
) )
// NewMockWaylandContext creates a new instance of MockWaylandContext. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockWaylandContext(t interface {
mock.TestingT
Cleanup(func())
}) *MockWaylandContext {
mock := &MockWaylandContext{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}
// MockWaylandContext is an autogenerated mock type for the WaylandContext type // MockWaylandContext is an autogenerated mock type for the WaylandContext type
type MockWaylandContext struct { type MockWaylandContext struct {
mock.Mock mock.Mock
@@ -36,10 +20,9 @@ func (_m *MockWaylandContext) EXPECT() *MockWaylandContext_Expecter {
return &MockWaylandContext_Expecter{mock: &_m.Mock} return &MockWaylandContext_Expecter{mock: &_m.Mock}
} }
// Close provides a mock function for the type MockWaylandContext // Close provides a mock function with no fields
func (_mock *MockWaylandContext) Close() { func (_m *MockWaylandContext) Close() {
_mock.Called() _m.Called()
return
} }
// MockWaylandContext_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' // MockWaylandContext_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close'
@@ -69,22 +52,23 @@ func (_c *MockWaylandContext_Close_Call) RunAndReturn(run func()) *MockWaylandCo
return _c return _c
} }
// Display provides a mock function for the type MockWaylandContext // Display provides a mock function with no fields
func (_mock *MockWaylandContext) Display() *client.Display { func (_m *MockWaylandContext) Display() *client.Display {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for Display") panic("no return value specified for Display")
} }
var r0 *client.Display var r0 *client.Display
if returnFunc, ok := ret.Get(0).(func() *client.Display); ok { if rf, ok := ret.Get(0).(func() *client.Display); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(*client.Display) r0 = ret.Get(0).(*client.Display)
} }
} }
return r0 return r0
} }
@@ -105,8 +89,8 @@ func (_c *MockWaylandContext_Display_Call) Run(run func()) *MockWaylandContext_D
return _c return _c
} }
func (_c *MockWaylandContext_Display_Call) Return(display *client.Display) *MockWaylandContext_Display_Call { func (_c *MockWaylandContext_Display_Call) Return(_a0 *client.Display) *MockWaylandContext_Display_Call {
_c.Call.Return(display) _c.Call.Return(_a0)
return _c return _c
} }
@@ -115,22 +99,23 @@ func (_c *MockWaylandContext_Display_Call) RunAndReturn(run func() *client.Displ
return _c return _c
} }
// FatalError provides a mock function for the type MockWaylandContext // FatalError provides a mock function with no fields
func (_mock *MockWaylandContext) FatalError() <-chan error { func (_m *MockWaylandContext) FatalError() <-chan error {
ret := _mock.Called() ret := _m.Called()
if len(ret) == 0 { if len(ret) == 0 {
panic("no return value specified for FatalError") panic("no return value specified for FatalError")
} }
var r0 <-chan error var r0 <-chan error
if returnFunc, ok := ret.Get(0).(func() <-chan error); ok { if rf, ok := ret.Get(0).(func() <-chan error); ok {
r0 = returnFunc() r0 = rf()
} else { } else {
if ret.Get(0) != nil { if ret.Get(0) != nil {
r0 = ret.Get(0).(<-chan error) r0 = ret.Get(0).(<-chan error)
} }
} }
return r0 return r0
} }
@@ -151,8 +136,8 @@ func (_c *MockWaylandContext_FatalError_Call) Run(run func()) *MockWaylandContex
return _c return _c
} }
func (_c *MockWaylandContext_FatalError_Call) Return(errCh <-chan error) *MockWaylandContext_FatalError_Call { func (_c *MockWaylandContext_FatalError_Call) Return(_a0 <-chan error) *MockWaylandContext_FatalError_Call {
_c.Call.Return(errCh) _c.Call.Return(_a0)
return _c return _c
} }
@@ -161,10 +146,9 @@ func (_c *MockWaylandContext_FatalError_Call) RunAndReturn(run func() <-chan err
return _c return _c
} }
// Post provides a mock function for the type MockWaylandContext // Post provides a mock function with given fields: fn
func (_mock *MockWaylandContext) Post(fn func()) { func (_m *MockWaylandContext) Post(fn func()) {
_mock.Called(fn) _m.Called(fn)
return
} }
// MockWaylandContext_Post_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Post' // MockWaylandContext_Post_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Post'
@@ -174,19 +158,13 @@ type MockWaylandContext_Post_Call struct {
// Post is a helper method to define mock.On call // Post is a helper method to define mock.On call
// - fn func() // - fn func()
func (_e *MockWaylandContext_Expecter) Post(fn any) *MockWaylandContext_Post_Call { func (_e *MockWaylandContext_Expecter) Post(fn interface{}) *MockWaylandContext_Post_Call {
return &MockWaylandContext_Post_Call{Call: _e.mock.On("Post", fn)} return &MockWaylandContext_Post_Call{Call: _e.mock.On("Post", fn)}
} }
func (_c *MockWaylandContext_Post_Call) Run(run func(fn func())) *MockWaylandContext_Post_Call { func (_c *MockWaylandContext_Post_Call) Run(run func(fn func())) *MockWaylandContext_Post_Call {
_c.Call.Run(func(args mock.Arguments) { _c.Call.Run(func(args mock.Arguments) {
var arg0 func() run(args[0].(func()))
if args[0] != nil {
arg0 = args[0].(func())
}
run(
arg0,
)
}) })
return _c return _c
} }
@@ -196,15 +174,14 @@ func (_c *MockWaylandContext_Post_Call) Return() *MockWaylandContext_Post_Call {
return _c return _c
} }
func (_c *MockWaylandContext_Post_Call) RunAndReturn(run func(fn func())) *MockWaylandContext_Post_Call { func (_c *MockWaylandContext_Post_Call) RunAndReturn(run func(func())) *MockWaylandContext_Post_Call {
_c.Run(run) _c.Run(run)
return _c return _c
} }
// Start provides a mock function for the type MockWaylandContext // Start provides a mock function with no fields
func (_mock *MockWaylandContext) Start() { func (_m *MockWaylandContext) Start() {
_mock.Called() _m.Called()
return
} }
// MockWaylandContext_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' // MockWaylandContext_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start'
@@ -233,3 +210,17 @@ func (_c *MockWaylandContext_Start_Call) RunAndReturn(run func()) *MockWaylandCo
_c.Run(run) _c.Run(run)
return _c return _c
} }
// NewMockWaylandContext creates a new instance of MockWaylandContext. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewMockWaylandContext(t interface {
mock.TestingT
Cleanup(func())
}) *MockWaylandContext {
mock := &MockWaylandContext{}
mock.Mock.Test(t)
t.Cleanup(func() { mock.AssertExpectations(t) })
return mock
}

Some files were not shown because too many files have changed in this diff Show More