Skip to content

leoho0722/SFSymbolsGenerator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

28 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

SFSymbolsGenerator

๐ŸŒ Language / ่ชž่จ€้ธๆ“‡

Swift Version Supported Platforms GitHub release (with filter)

Simplifying SF Symbols Enumeration Generation with Swift!

A Swift-based command-line utility that generates type-safe Swift enumerations for SF Symbols with proper availability annotations, built with clean architecture principles.

โœจ Features

  • ๐ŸŽฏ Type-Safe Generation: Creates Swift enumerations with compile-time safety
  • ๐Ÿ“ฑ Availability Annotations: Automatic @available attributes for proper platform support
  • ๐Ÿ”„ Dual Version Support: Works with both stable and beta SF Symbols versions
  • ๐Ÿ—๏ธ Clean Architecture: Well-structured codebase following SOLID principles
  • โšก Performance Optimized: Fast symbol processing and code generation
  • ๐Ÿ› ๏ธ Keyword Handling: Proper handling of Swift reserved keywords
  • ๐Ÿ“ Documentation: Comprehensive inline documentation and comments

๐Ÿ“‹ Requirements

  • macOS: 14.0 or later
  • Xcode: 15.0 or later
  • Swift: 5.8 or later
  • SF Symbols App: Version 5.0 or later (stable) / Version 7.0 or later (beta)

๐Ÿ—๏ธ Project Architecture

This project follows Clean Architecture principles with a clear separation of concerns:

Sources/
โ”œโ”€โ”€ Application/                   # Application Layer
โ”‚   โ”œโ”€โ”€ Commands/                  # CLI command implementations
โ”‚   โ””โ”€โ”€ SFSymbolsGenerator.swift
โ”œโ”€โ”€ Domain/                        # Domain Layer
โ”‚   โ”œโ”€โ”€ Models/                    # Domain models and extensions
โ”‚   โ””โ”€โ”€ Services/                  # Core business logic services
โ”œโ”€โ”€ Infrastructure/                # Infrastructure Layer
โ”‚   โ”œโ”€โ”€ FileSystem/                # File operations
โ”‚   โ””โ”€โ”€ Errors/                    # Error handling
โ””โ”€โ”€ Foundation/                    # Foundation Layer
    โ””โ”€โ”€ Types/                     # Type aliases and basic types

Architecture Benefits

  • Maintainability: Clear separation makes the code easy to understand and modify
  • Testability: Each layer can be independently tested
  • Scalability: Easy to add new features without affecting existing code
  • Reusability: Components can be reused across different contexts

๐Ÿ“ฆ Installation

Homebrew Installation (Recommended)

brew tap leoho0722/tap
brew install sf-symbols-generator

From Releases

  1. Download the latest binary from GitHub Releases
  2. Extract and place the binary in your desired location
  3. Make it executable: chmod +x sf-symbols-generator

Build from Source

git clone https://github.com/leoho0722/SFSymbolsGenerator.git
cd SFSymbolsGenerator
swift build -c release
# Binary will be at .build/release/sf-symbols-generator

๐Ÿš€ Usage

Command Structure

sf-symbols-generator generate <filepath> [--name <name>] [--enum-name <enum-name>] [--use-beta]
sf-symbols-generator version

Generate Command

# Basic usage
sf-symbols-generator generate /path/to/output

# With custom filename
sf-symbols-generator generate /path/to/output --name CustomSymbols

# Using beta version
sf-symbols-generator generate /path/to/output --use-beta

# Complete example
sf-symbols-generator generate ~/Desktop --name MySymbols --use-beta

Command Options

Option Description Default Required
filepath Directory where the Swift file will be generated - โœ…
--name Specify filename of output SFSymbols+Enum โŒ
--enum-name Specify enum name of output SFSymbols โŒ
--use-beta Whether use beta version of SF Symbols or not false โŒ

๐Ÿ“ Generated Output

The tool generates a Swift enumeration file with the following structure:

// SFSymbols.swift
// Generated by SFSymbolsGenerator
// Do not edit this file manually.

import Foundation

public enum SFSymbols: String, CaseIterable {
    /// SF Symbols's name๏ผšarrow.left
    @available(iOS 13.0, macOS 10.15, *)
    case arrowLeft = "arrow.left"
    
    /// SF Symbols's name๏ผšstar.fill
    @available(iOS 14.0, macOS 11.0, *)
    case starFill = "star.fill"
    
    public static var allCases: [SFSymbols] {
        var allCases: [SFSymbols] = []
        if #available(iOS 13.0, macOS 10.15, *) {
            allCases.append(.arrowLeft)
        }
        if #available(iOS 14.0, macOS 11.0, *) {
            allCases.append(.starFill)
        }
        return allCases
    }
}

๐Ÿ› ๏ธ Development

Building the Project

swift build

Running Tests

swift test

Project Structure Details

  • Application Layer: Contains the main CLI interface and command handling
  • Domain Layer: Core business logic for symbol processing and code generation
  • Infrastructure Layer: File I/O operations and error handling infrastructure
  • Foundation Layer: Basic types, aliases, and utility definitions

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

Development Guidelines

  1. Follow Swift coding conventions
  2. Maintain clean architecture principles
  3. Add tests for new functionality
  4. Update documentation as needed

๐ŸŽฏ Usage Examples

Using in iOS/macOS Projects

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Use the generated enumeration
        let imageView = UIImageView()
        imageView.image = UIImage(systemName: SFSymbols.starFill.rawValue)
        
        // Check availability
        if SFSymbols.allCases.contains(.arrowLeft) {
            print("Arrow left symbol is available")
        }
    }
}

Using in SwiftUI

import SwiftUI

struct ContentView: View {

    var body: some View {
        VStack {
            Image(systemName: SFSymbols.starFill.rawValue)
                .font(.largeTitle)
            
            Text("Available symbols: \\(SFSymbols.allCases.count)")
        }
    }
}

๐Ÿ”ง Advanced Features

Error Handling

The tool provides detailed error messages for various scenarios:

  • SF Symbols application not installed
  • File permission issues
  • Data format errors
  • Code generation failures

Symbol Name Conversion

The tool automatically handles:

  • Dot notation to camelCase conversion (arrow.left โ†’ arrowLeft)
  • Swift keyword handling (return โ†’ `return`)
  • Numbers at the beginning (1.circle โ†’ _1Circle)

Availability Annotations

Automatically generates based on SF Symbols release timeline:

  • iOS 13.0+: Symbols released in 2019
  • iOS 14.0+: Symbols released in 2020
  • iOS 15.0+: Symbols released in 2021
  • And so on...

๐Ÿ› Troubleshooting

Common Issues

Q: SF Symbols application not found

A: Make sure you have downloaded and installed the SF Symbols app from Apple Developer website.

Q: Generated file is empty

A: Check that your SF Symbols app version is correct and that symbol data is available.

Q: Permission denied

A: Ensure the output directory has write permissions, or run the command with sudo.

Reporting Issues

If you encounter issues, please create a GitHub issue with:

  1. Error message
  2. Command executed
  3. System environment (macOS version, SF Symbols version)
  4. Expected vs actual behavior

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

๐Ÿ“š Documentation

For more detailed documentation, please check:

๐Ÿ”— Related Links


Made with โค๏ธ by Leo Ho

About

Simplifying SF Symbols Enumeration Generation with Swift!

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages